在Linux上尝试将C代码与ICU Unicode库链接时出现了一个奇怪的问题



我一直在玩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, "%Sn", ustr1);
return(0);
}

在我的Linux Mint 19.2 Cinnamon 64位系统上,根据icu配置输出编译以上内容,得到了

$ 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_entrRY_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

您还需要为icu配置标记--ldflags-icuio

相关内容

最新更新