如何让CMake实际上与find_library找到的库链接

时间:2016-01-06 21:48:38

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

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

我下载了最新的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. ..

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的服务器上编译时没有问题。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

find_library,找到库文件的确切路径( so dll ,具体取决于平台)。之后,您仍然需要执行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)