Странная проблема при попытке связать код C с библиотеками Unicode ICU на Linux - PullRequest
0 голосов
/ 30 марта 2020

Я играл с библиотеками ICU Unicode, и недавно я столкнулся с некоторыми странными ошибками компоновки, которые озадачили меня.

Я сузил код до минимального примера, который демонстрирует ошибки компоновщика:

#include <unicode/uchar.h>
#include <unicode/ustdio.h>
#include <unicode/utypes.h>
//#include <unicode/coll.h>

int main(void) {
    UFILE *ustdout;
    ustdout = u_get_stdout();
    UChar32 *ustr1 = L"Ich bin glücklich!";
    u_fprintf(ustdout, "%S\n", ustr1);
    return(0);
}

На моей Linux Mint 19.2 Cinnamon 64-bit system, компиляция вышеупомянутого, в соответствии с выводом icu-config, дает мне:

$ gcc c-icu-test-3.c -I/usr/include -licui18n -licuuc -licudata -o c-icu-test-3.bin
/tmp/ccjku7rS.o: In function `main':
c-icu-test-3.c:(.text+0x9): undefined reference to `u_get_stdout_60'
c-icu-test-3.c:(.text+0x34): undefined reference to `u_fprintf_60'
collect2: error: ld returned 1 exit status

Согласно "icu- config - cc --cflags --cppflags --ldflags-libsonly ", я использую правильные параметры командной строки.

Я отследил проблему до чего-то сделать с макросом «U_ICU_ENTRY_POINT_RENAME» и, выполнив «find / usr / include / unicode / -regextype gnu-awk -regex '(. .c $) | (. .h $)' - exe c grep -H -n -P '^ # define + U_ICU_ENTRY_POINT_RENAME. * $' {} \; " выходные данные:

$ find /usr/include/unicode/ -regextype gnu-awk -regex '(.*\.c$)|(.*\.h$)' -exec grep -H -n -P '^#define +U_ICU_ENTRY_POINT_RENAME.*$' {} \;
/usr/include/unicode/uvernum.h:109:#define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME)
/usr/include/unicode/uvernum.h:113:#define U_ICU_ENTRY_POINT_RENAME(x)    U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX)

Я убедился, что у меня есть все необходимые заголовочные файлы и библиотеки. Там, похоже, есть какое-то несоответствие версий, но я не знаю, как его решить.

Любая помощь будет признательна.

Спасибо,

jdb2

1 Ответ

1 голос
/ 31 марта 2020

Вам также нужно пометить --ldflags-icuio для icu-config.

...