首页 > 解决方案 > 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 对此类功能的支持 - “给我一些链接的起源” - 但考虑到 CMake 工作流程,以下方式可以帮助完成此类任务。

  1. 获取带有链接器参数的精确字符串,其中包括“未知”链接。

    例如,使用 Makefile 生成器,您可以运行make VERBOSE=1它将打印执行的确切命令行。此外,在某些情况下,CMake 会link.txt使用链接器的参数创建文件。

  2. 在带有链接器参数的字符串中找到您感兴趣的“未知”链接。

  3. 注意最近的链接参数,您可以识别哪个来源。正是这些论点可以为您提供有关“未知”链接的提示:

    • “未知”链接的起源可能靠近最近的链接参数之一(以相同的顺序!)。

    • 可能在与最近的链接参数相同的调用中请求“未知”链接。 target_link_libraries

    • 最后,“未知”链接和最近的链接可能是同一个 IMPORTED/INTERFACE 库目标的一部分。

      例如find_package(XXX),可以以 的形式创建 IMPORTED/INTERFACE 目标XXX::yyy,其中包含属于包本身的库和它们所依赖的库。


推荐阅读