了解target_link_libraries

时间:2018-09-05 20:00:26

标签: linux ubuntu cmake

我是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工具构建connectionPi,串行器等并与app(这是在我的代码中创建的可执行文件)链接?
  2. 所有这些库都位于哪里?
  3. 当我做ldconfig -p | grep <libraryname>时,对于上述库 有时我会发现类似以下的输出,有时什么也没有,为什么?
  4. target_link_libraries是否足够聪明,可以在以下位置查找库 子目录呢?我的意思是我看到有些东西在下面 用户/库,其中一些是下一个级别,例如 /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 | grepconnectionPi
          libwiringPiDev.so(libc6,float)=> /usr/local/lib/libwiringPiDev.so
          libwiringPiDev.so(libc6,float)=> /usr/lib/libwiringPiDev.so
          libwiringPi.so(libc6,float)=> /usr/local/lib/libwiringPi.so
          libwiringPi.so(libc6,float)=> /usr/lib/libwiringPi.so

2 个答案:

答案 0 :(得分:1)

  
      
  1. 我们是否告诉CMake工具构建connectionPi,串行器等并与app(这是在我的代码中创建的可执行文件)链接?
  2.   

不完全是。该命令告诉CMake,必须在目标的链接阶段将库wiringPiserializer链接到目标“ app”。它没有说明如何自行构建库,通常期望它们已经可用而不是构建。

  
      
  1. 这些库都在哪里?
  2.   

它可能会有所不同。编译器具有在其中查找库的目录的默认列表。其他CMake命令可以添加将目录添加到该列表的链接选项。

  
      
  1. 当我做ldconfig -p | grep <libraryname>时,对于上述库,有时我会找到类似以下的输出,有时   没什么,为什么呢?
  2.   

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

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

这不是CMake的功能,而是选定的工具链及其配置(在Linux上,通常是带有GCC的GNU工具链)。通常可以假设默认情况下工具链使用所有正确的 standard 库目录。有时也可以成功指示CMake在其他可能的位置搜索特定的库,但是target_link_libraries并不是其中的一部分。

答案 1 :(得分:1)

当您将不是目标的纯名称(而不是路径)传递给((APlayerWeapon *)Weapon->GetChildActor())->Shoot(); 时,CMake只会将此名称转换为链接器标志。例如。在Linux上,这是标志

target_link_libraries

因此,有关搜索库的问题可能会直接指向链接程序-CMake在此处不可用。