了解target_link_libraries

问题描述 投票:-1回答:2

我是Linux新手。我在我的CMakeLists.txt中看到以下内容;

  target_link_libraries(app wiringPi
                          serializer
                          iothub_client
                          iothub_client_mqtt_transport
                          umqtt
                          aziotsharedutil
                          ssl
                          crypto
                          curl
                          pthread
                          m
                          ssl
                          crypto)

我的问题/理解是;通过做这个

  1. 我们是否告诉CMake工具构建wiringPi,序列化器等并与app(这是我的代码中创建的可执行文件)链接?
  2. 所有这些图书馆在哪里?
  3. 当我做ldconfig -p | grep <libraryname>时,对于上面的库有时我会发现如下的输出,有时候什么都没有,为什么呢?
  4. target_link_libraries是否足够聪明,可以在子目录下查找库?我的意思是我看到有些只是在user / lib下面,有些是在/usr/lib/arm-linux-gnueabihf之下的另一个级别

pi @ raspberrypi:〜$ ldconfig -p | grep curl libcurl.so.4(libc6,hard-float)=> /usr/lib/arm-linux-gnueabihf/libcurl.so.4 libcurl-gnutls.so.4(libc6,hard-float)=> /usr/lib/arm-linux-gnueabihf/libcurl-gnutls.so.4

pi @ raspberrypi:〜$ ldconfig -p | grep wiringPi libwiringPiDev.so(libc6,hard-float)=> /usr/local/lib/libwiringPiDev.so libwiringPiDev.so(libc6,hard-float)=> /usr/lib/libwiringPiDev.so libwiringPi.so(libc6,hard-float)=> /usr/local/lib/libwiringPi.so libwiringPi.so(libc6,hard-float)=> /usr/lib/libwiringPi.so

linux ubuntu cmake
2个回答
1
投票
  1. 我们是否告诉CMake工具构建wiringPi,序列化器等并与app(这是我的代码中创建的可执行文件)链接?

不完全是。该命令告诉CMake库wiringPiserializer等必须在该目标的链接阶段链接到目标'app'。它没有说明自己构建库,通常它们已经可用而不是构建。

  1. 所有这些图书馆在哪里?

它可以变化。编译器有一个默认的目录列表,用于查找库。其他CMake命令可以添加将目录添加到该列表的链接选项。

  1. 当我做ldconfig -p | grep <libraryname>时,对于上面的库有时我会发现如下的输出,有时候什么都没有,为什么呢?

ldconfig报告动态链接器已知的库。这与在编译时运行的链接器不同,并且两者知道的目录和库不一定相同。 ldconfig可能未列出给定库的原因包括:

  1. 未安装库。
  2. 仅安装了库的静态版本。
  3. 该库不在默认情况下动态链接器检查的任何位置(当程序启动时,可以至少以两种不同的方式指定其他目录)。
  1. target_link_libraries是否足够聪明,可以在子目录下查找库?我的意思是我看到有些只是在user/lib下,有些是在/usr/lib/arm-linux-gnueabihf之下的一个级别

这不是CMake的功能,而是选择的工具链及其配置(在Linux上,通常是GNU工具链,以GCC为特色)。通常可以安全地假设工具链默认使用所有正确的标准库目录。有时可以成功地指示CMake在其他可能的地方搜索特定的库,但target_link_libraries不是其中的一部分。


1
投票

当您向target_link_libraries传递一个不是目标的普通名称(不是路径)时,CMake只会将此名称转换为链接器标志。例如。在Linux上这是标志

-l<library-name>

所以关于搜索库的问题你可以直接联系到链接器--Cake在这里不在游戏中。

© www.soinside.com 2019 - 2024. All rights reserved.