udata.cpp: undefined reference to `icudt71_dat'。

7

在Ubuntu 22.04构建now project时,我遇到了一个奇怪的与ICU相关的链接错误。

/usr/bin/ld: /usr/bin/ld: DWARF error: invalid or unhandled FORM value: 0x23
/home/bkey1/vcpkg/installed/x64-linux/debug/lib/libicuuc.a(udata.ao): in function `openCommonData(char const*, int, UErrorCode*)':
udata.cpp:(.text+0x23f7): undefined reference to `icudt71_dat'
/usr/bin/ld: udata.cpp:(.text+0x2458): undefined reference to `icudt71_dat'

链接命令如下。
usr/bin/cmake -E cmake_link_script CMakeFiles/now.dir/link.txt --verbose=1
/usr/bin/c++  -std=c++2a -Wall -Wextra -Wfloat-equal -Wno-long-long -Wpedantic -funsigned-char -D_GNU_SOURCE=1 -rdynamic CMakeFiles/now.dir/GetStardate.cpp.o CMakeFiles/now.dir/GetTime.cpp.o CMakeFiles/now.dir/GetTimePlatformPOSIX.cpp.o CMakeFiles/now.dir/GetTimePlatformWin32.cpp.o CMakeFiles/now.dir/ISO8601_time.cpp.o CMakeFiles/now.dir/InitLocale.cpp.o CMakeFiles/now.dir/executable_path.cpp.o CMakeFiles/now.dir/now.cpp.o CMakeFiles/now.dir/nowStrings.cpp.o -o now  /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_chrono.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_filesystem.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_locale.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_log.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_program_options.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_regex.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_system.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_thread.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_date_time.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_log_setup.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libboost_atomic.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libicudata.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libicui18n.a /home/bkey1/vcpkg/installed/x64-linux/debug/lib/libicuuc.a 
3个回答

2

首先,我想强调的是提供的信息非常少,因此像我的回答一样,很可能需要猜测正在发生什么。另一方面,我理解你的情况:你不能包含你不知道与主题相关的信息。

回答: 我想提醒你的是,符号icudt71_dat在代码中并没有直接出现,而是使用宏生成的。(请检查.../source/common/unicode/utypes.h)因此,如果链接器抱怨找不到这样的符号,那么它很可能意味着你正在链接一个与你拥有的头文件版本不同的库。现在我不知道具体是如何发生的,我需要看看你的系统、包含路径、链接路径等。但是我强烈建议重新审查包含和链接路径。你可以重新编译库,验证没有其他版本,然后重新编译并开始。如果头文件对应源文件,那么它应该能够工作。


2
我还没有想出如何解决我的问题,但这个答案确实帮助我找出了问题所在。显然,我正在使用一个版本的ICU头文件(来自系统包含路径),并链接另一个版本的ICU库文件(来自VCPKG)。我需要在我的CMake构建过程中解决这个问题。 - Benilda Key
我为问题描述不够清晰而道歉。当你不知道为什么会发生某些事情时,你必须描述症状并希望尽力解决。 - Benilda Key
1
@BenKey,你解决了构建系统的问题吗?我也遇到了同样的问题。 - jhruby
1
@jhruby 是的。我花了一些时间才弄明白,但最终还是做到了。不管你信不信,ICU库的顺序实际上很重要。之前,我按照以下顺序链接ICU库:data i18n uc。现在,我按照以下顺序链接库:i18n uc data。关键是在链接其他库后,必须链接数据库。 - Benilda Key
1
@BenKey 我刚从假期回来,你帮我省了很多时间 :D 非常感谢你。 - jhruby

1
如果你将ICU与静态库链接,链接的顺序可能很重要,请尝试以下方法:
  list(APPEND ICU_LINK_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/../third_party/icu4c/lib/${TARGET_PLATFORM_NAME}/libicui18n.a)
  list(APPEND ICU_LINK_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/../third_party/icu4c/lib/${TARGET_PLATFORM_NAME}/libicuuc.a)
  list(APPEND ICU_LINK_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/../third_party/icu4c/lib/${TARGET_PLATFORM_NAME}/libicudata.a)
  list(APPEND ICU_LINK_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/../third_party/icu4c/lib/${TARGET_PLATFORM_NAME}/libicuio.a)
  list(APPEND ICU_LINK_LIBRARIES ${CMAKE_CURRENT_LIST_DIR}/../third_party/icu4c/lib/${TARGET_PLATFORM_NAME}/libicutu.a)

-1

显然你缺少icu-devtools包。请使用以下命令安装:

sudo apt get install icu-devtools

这与问题无关。我正在使用通过VCPKG获得的ICU,而不是使用apt get安装的ICU库。此外,即使我正在使用通过apt get安装的ICU库,告诉我安装icu-devtools也不提供任何与我遇到的奇怪链接错误相关的信息。这些库可用并已链接。但我仍然遇到错误。 - Benilda Key

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接