【问题标题】:Strange problem when trying to link C code against ICU Unicode libraries on Linux尝试将 C 代码与 Linux 上的 ICU Unicode 库链接时出现奇怪的问题
【发布时间】:2020-07-11 02:01:43
【问题描述】:

我一直在使用 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 位系统上,根据 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$)' -exec 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

【问题讨论】:

    标签: linux gcc unicode linker icu


    【解决方案1】:

    您还需要为 icu-config 标记 --ldflags-icuio

    【讨论】:

    • 感谢您的提示! :D 它解决了我的问题! :) 似乎我忘了包含 ICU I/O 库 :) 我在责备这个库 :P (这几乎是从不编译器的错 :))
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2012-02-17
    • 2021-09-25
    • 2020-05-28
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多