【问题标题】:Linking with CMakeLists: ld cannot find library与 CMakeLists 链接:ld 找不到库
【发布时间】:2017-06-29 09:32:00
【问题描述】:

我有一个CMakeLists.txt 文件,其中包含以下内容:

target_link_libraries(${PROJECT_NAME} OpenNI2)

当我运行cmake 时,我没有收到任何错误。但是当我运行make 时,我收到以下错误:

/usr/bin/ld: cannot find -lOpenNI2

但是,我的构建目录中有一个名为 libOpenNI2.so 的文件。那么为什么ld 找不到呢?我以为构建目录在target_link_libraries的搜索路径上?

谢谢!

【问题讨论】:

    标签: c++ ubuntu makefile cmake


    【解决方案1】:

    这是因为在链接时,链接器不会查看 当前 目录,而只会查看一组预定义的目录。

    您需要告诉 CMake 库在哪里,例如通过在 target_link_library 命令或 adding it as an imported library 中提供库的完整路径。

    【讨论】:

      【解决方案2】:

      如果添加类似:它会起作用:

      target_link_libraries(${PROJECT_NAME} /path_to_library_build/libOpenNI2.a)
      

      详情:

      ld 正在查找定义在

      中的非常短的文件夹列表中的库
      /etc/ld.so.conf
      

      它通常如下所示:

      include /etc/ld.so.conf.d/*.conf
      

      这些 *.conf 文件中的实际路径列表通常如下:

      # Legacy biarch compatibility support
      /lib32
      /usr/lib32
      # Multiarch support
      /usr/local/lib/x86_64-linux-gnu
      /lib/x86_64-linux-gnu
      /usr/lib/x86_64-linux-gnu
      

      如果您的项目链接库不在此列表的文件夹中,ld 不会找到它,除非一个特殊的链接变量集 LD_LIBRARY_PATH 带有您的库的路径或完整的路径/库cmake target_link_libraries 指令中提供的名称。

      details on how to proper setup LD_LIBRARY_PATH variable discussed here

      【讨论】:

      • 您好,谢谢您的回答!你能解释一下吗?这将有助于 OP 和未来的读者:)
      • @Oleg Kokorin 特定库的静态版本和共享版本都在同一个文件夹中,那么 Cmake 在调用 target_link_libraries(target_name, library_name_without_postfix) 时更喜欢链接到哪个库?
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 2017-10-19
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多