【问题标题】:How to make CMake actually link with the library it finds with find_library如何使 CMake 实际链接到它使用 find_library 找到的库
【发布时间】:2016-01-06 21:48:37
【问题描述】:

我在 Ubuntu 14.04 上,默认安装了 glew 1.10。我想使用最新的 glew 1.13,但是 sudo apt-get remove libglew1.10 不是一个选项,因为 ubuntu-desktop 依赖它,我不小心做了一次,我不得不进入恢复模式重新安装所有东西。

我下载了最新的 glew 1.13 和 sudo make install。 glew 1.13 库安装在 /usr/lib64/libGLEW.so 下。旧的 1.10 仍然在 /usr/lib/x86_64-linux-gnu/libGLEW.so。 /usr/include/GL/glew.h 和 /usr/include/GL/wglew.h 的头文件确实被 1.13 中的头文件替换了。

在我的 FindGLEW.cmake 中,它确实在我运行 cmake 后成功找到了正确的 libGLEW.so ..

find_library(GLEW_LIBRARY NO_DEFAULT_PATH
    NAMES
        GLEW glew
    PATHS
        /usr/lib64
        DOC "The GLEW library"
        )

可以通过 ccmake .. 验证,GLEW_LIBRARY 部分确实显示 /usr/lib64/libGLEW.so。

但是,当我编译代码时,我仍然从 glew 1.13 中可用的方法中得到未定义的引用错误,进一步检查 ldd mylib.so,它显示

libGLEW.so.1.10 => /usr/lib/x86_64-linux-gnu/libGLEW.so.1.10 (0x00007f10d130b000)

这意味着它仍然与 1.10 中的旧共享库链接,并将目录搜索优先级设置为 etc/ld.so.conf.d/* 高于 find_library 默认指定的路径。我该如何解决这个问题?

附带说明一下,具有完全相同 CMakeLists 的完全相同的代码在没有安装 libglew1.10 和 ubuntu-desktop 的服务器上编译不会出现问题。

【问题讨论】:

  • 使用find_library 宏,您只能“找到”库。您不与此链接。您必须将 GLEW_LIBRARY 值添加到 add_library。你检查过这个吗?您还可以查看:link_directories() 以确保您与 /usr/lib64 中的 glew 链接?
  • @P.Brunet 我做了target_link_libraries(myproject ${GLEW_LIBRARY})。不确定 link_directories 但即使是官方 CMake 文档也不鼓励使用它
  • @user3667089,安装更新版本的 ubuntu 可能是最简单的方法。可能不是你想听到的,但我想我会提到它..

标签: c++ ubuntu cmake shared-libraries dynamic-linking


【解决方案1】:

ldd 和 ld 将运行时共享库​​加载器信息考虑在内(通过 LD_LIBRARY_PATH env var)。

因此,在链接您的程序之前,请务必执行以下操作:

export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH

更多信息:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

【讨论】:

  • 感谢您的回答,但是 /usr/lib64 已经被 find_library 添加到了路径中,因此再次将其添加到 LD_LIBRARY_PATH 是多余的,只是其中有两个 libGLEW.so (完全相同的名称)路径,并且不知何故 ubuntu 决定从 /usr/lib/x86_64-linux-gnu/ 中选择一个而不是 /usr/lib64
  • 重新链接 mylib.soLD_LIBRARY_PATH 设置?
  • 将 /usr/lib64 添加到 LD_LIBRARY_PATH 但仍然链接错误,LD_LIBRARY_PATH 的优先级仍然低于默认搜索路径。你试过了吗?它对你有用吗?
【解决方案2】:

find_library,查找库文件的确切路径(sodll 取决于平台)。之后,您仍然需要执行 add_library 以链接到它。当我在另一个库中遇到此问题时,以下内容对我有用:

find_library(GLEW_LIBRARY NO_DEFAULT_PATH
    NAMES GLEW glew 
    PATHS /usr/lib64
    DOC "The GLEW library")

add_library(glew SHARED IMPORTED)

set_target_properties(glew 
    PROPERTIES IMPORTED_LOCATION ${GLEW_LIBRARY})

target_link_libraries(myproject glew)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2015-06-21
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多