cmake - cmake未知链接,谁要求链接?
问题描述
我有一个使用不同工具链的 cmake 项目。( native x86
,a yocto generated
和 a precompiled
) 该项目包括一些库,它们都很好并且链接正确。
find_package(Boost
1.74.0
REQUIRED
COMPONENTS log log_setup system filesystem thread program_options )
find_library(LIB_MOSQPP mosquittopp REQUIRED)
find_library(LIB_MOSQ mosquitto REQUIRED)
find_library(LIB_PTHREAD pthread REQUIRED)
find_library(LIB_CRYPTO crypto REQUIRED)
find_library(LIB_SSL ssl REQUIRED)
现在,使用预编译的工具链 cmake 链接到 libicu -licudata -licui18n -licuuc
,而其他工具链则没有。有没有办法找出为什么 libicu 被链接?响应。谁/哪个模块取决于它?
链接器命令如下所示:
cat ./CMakeFiles/OBCAgent.dir/link.txt:1
/home/shell/tmp/armv7-eabihf--musl--stable-2020.08-1/bin/arm-buildroot-linux-musleabihf-g++ --sysroot=/home/shell/tmp/armv7-eabihf--musl--stable-2020.08-1/arm-buildroot-linux-musleabihf/sysroot/ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -fstack-protector-strong CMakeFiles/OBCAgent.dir/src/AccumulatedData.cpp.o CMakeFiles/OBCAgent.dir/src/AgentConfig.cpp.o CMakeFiles/OBCAgent.dir/src/BasicDataSet.cpp.o CMakeFiles/OBCAgent.dir/src/OBCAgent.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/LFMMsgParser.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/MsgPacker.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/MsgParser.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/MsgSplitter.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/ObcConfig.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/PlayMqtt.cpp.o CMakeFiles/OBCAgent.dir/home/shell/sh-services/src/Common/src/boost_helper.cpp.o -o OBCAgent -L/home/shell/tmp/alpine/usr/lib -Wl,-rpath,/home/shell/tmp/alpine/usr/lib /home/shell/tmp/alpine/usr/lib/libboost_system.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_log_setup.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_program_options.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libpthread.a /home/shell/tmp/alpine/usr/lib/libmosquittopp.so /home/shell/tmp/alpine/usr/lib/libmosquitto.so /home/shell/tmp/alpine/usr/lib/libcares.so /home/shell/tmp/alpine/usr/lib/libssl.so /home/shell/tmp/alpine/usr/lib/libcrypto.so /home/shell/tmp/alpine/usr/lib/libboost_log.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_thread.so.1.75.0 -lrt /home/shell/tmp/alpine/usr/lib/libboost_atomic.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_chrono.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_filesystem.so.1.75.0 /home/shell/tmp/alpine/usr/lib/libboost_regex.so.1.75.0 -licudata -licui18n -licuuc
解决方案
我不知道 CMake 对此类功能的支持 - “给我一些链接的起源” - 但考虑到 CMake 工作流程,以下方式可以帮助完成此类任务。
获取带有链接器参数的精确字符串,其中包括“未知”链接。
例如,使用 Makefile 生成器,您可以运行
make VERBOSE=1
它将打印执行的确切命令行。此外,在某些情况下,CMake 会link.txt
使用链接器的参数创建文件。在带有链接器参数的字符串中找到您感兴趣的“未知”链接。
注意最近的链接参数,您可以识别哪个来源。正是这些论点可以为您提供有关“未知”链接的提示:
“未知”链接的起源可能靠近最近的链接参数之一(以相同的顺序!)。
可能在与最近的链接参数相同的调用中请求“未知”链接。
target_link_libraries
最后,“未知”链接和最近的链接可能是同一个 IMPORTED/INTERFACE 库目标的一部分。
例如
find_package(XXX)
,可以以 的形式创建 IMPORTED/INTERFACE 目标XXX::yyy
,其中包含属于包本身的库和它们所依赖的库。
推荐阅读
- sql - 在 MS Access 中使用 CCur() 时如何处理错误“#Error”
- python - 即使我的格式正确,Tkinter 按钮也没有运行该功能
- symfony - Symfony 4 - 无法创建实体
- c++ - 如何从源代码构建单线程 TensorFlow 2.x
- ruby-on-rails - PaperTrial 版本处理变更集错误
- python - 我被卡住了:如何解决缓慢的执行时间?
- ide - 如何控制显示在中央窗格中的单位数量?
- c++ - 在智能指针中使用模板类和 const 限定进行模板推导
- android - 无法创建任务 ':app:minifyReleaseWithR8'。无法查询此提供程序的值,因为它没有可用的值
- c - 3.3 C中读取的字符串不能倒序输出