关于C#:ICU ustdio.h函数:使用CMake构建时,在Mac OS上未定义符号

ICU ustdio.h functions: Undefined symbols on Mac OS when building with CMake

我正在制作一个基于文本的游戏,使用ICU在3个主要PC平台上处理UTF-8编码的JSON文件中的游戏文本。在引用ICU类型(例如UChar,UnicodeString等)时,我能够使用CMake编译并链接游戏二进制文件,并且一切正常。奇怪的是,在不引起"未定义符号"链接器错误的情况下,某些标题无法访问任何类型或函数。特别是,我需要从其中访问u_fopen(),u_fclose(),u_fgets()等的头文件" ustdio.h",以从我的JSON文件中提取unicode字符串。

Undefined symbols for architecture x86_64:
"_u_fclose_57", referenced from:
FileReader::Close() in libsource.a(FileReader.cpp.o)
"_u_fgets_57", referenced from:
FileReader::HasNextLine() in libsource.a(FileReader.cpp.o)
FileReader::NextLine() in libsource.a(FileReader.cpp.o)
"_u_fopen_57", referenced from:
FileReader::FileReader(std::__1::basic_string, std::__1::allocator >) in libsource.a(FileReader.cpp.o)

我正在使用此CMake模块文件来定位.h.dylib文件。从CMake输出中,我知道它是与/usr/local/lib/libicuuc.dylib链接的,但是在该文件夹中,我还可以看到许多其他与ICU相关的dylib。另一个程序员指示我检查要查找的符号是否使用nmdylib中确实定义了,并且在符号列表中可以看到它们不是。我是否可以假定这些符号是在其他dylib文件之一中定义的?如果是,并且我找到了正确的dylib,如何修改FindICU.cmake以链接到额外的动态库?该模块在我看来真的很钝,而且我不知道要在哪里更改它以解决此问题。


我通过搜索每个与ICU相关的dylib文件的符号表来弄清楚,直到找到丢失的符号(在libicuio.57.1.dylib中定义)。这使我意识到FindICU.cmake确实找不到这些符号。然后,我设法解析了足够多的文件以识别问题:存在一个变量ICU_FIND_COMPONENTS,必须将其设置为所需组件的列表,以便模块文件可以与其他dylib链接。没有在任何地方记录该变量,这非常令人沮丧。但是我通过将这行添加到第121行之前的FindICU.cmake解决了链接器错误:

1
set(${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS io)

此外,您还可以通过输出变量ICU_<component>_FOUND的值来检查是否链接了所需的组件。在我的情况下,ICU_IO_FOUND返回的是false,因为除非明确指示,否则模块不会搜索io dylib。这就是促使我需要修改FindICU.cmake以便链接符号来源的额外dylib文件的原因。