C++ 如何使CMake实际链接到它通过find_library找到的库

C++ 如何使CMake实际链接到它通过find_library找到的库,c++,ubuntu,cmake,shared-libraries,dynamic-linking,C++,Ubuntu,Cmake,Shared Libraries,Dynamic Linking,我在Ubuntu 14.04上,默认安装了glew 1.10。我想使用最新的glew 1.13,但是sudo apt get remove libglew1.10不是一个选项,因为ubuntu桌面依赖于它,我不小心做了一次,我不得不进入恢复模式重新安装所有东西 我下载了最新的glew 1.13和sudo make安装。glew 1.13库安装在/usr/lib64/libGLEW.so下。旧的1.10版本仍然位于/usr/lib/x86_64-linux-gnu/libGLEW.so。位于/us

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

我下载了最新的glew 1.13和sudo make安装。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中,它确实成功地找到了正确的libGLEW.so,因此在我运行cmake之后

find_library(GLEW_LIBRARY NO_DEFAULT_PATH
    NAMES
        GLEW glew
    PATHS
        /usr/lib64
        DOC "The GLEW library"
        )
可由ccmake验证,GLEW_库部分确实显示了/usr/lib64/libGLEW.so

然而,当我编译代码时,我仍然从仅从glew 1.13中可用的方法中得到未定义的引用错误,进一步使用ldd mylib进行检查

libGLEW.so.1.10 => /usr/lib/x86_64-linux-gnu/libGLEW.so.1.10 (0x00007f10d130b000)
这意味着它仍然在链接1.10中的旧共享库,并将目录搜索优先级设置为etc/ld.so.conf.d/*高于默认情况下find_library指定的路径。我怎样才能解决这个问题


作为补充说明,在没有安装libglew1.10和ubuntu桌面的服务器上,使用完全相同的CMakeLists编译完全相同的代码不会出现问题。

ldd和ld考虑运行时共享库加载器信息(通过
ld_library_PATH
env var)

因此,请确保在链接程序之前执行以下操作:

export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH

更多信息:

ldd和ld考虑运行时共享库加载器信息(通过
ld\u library\u路径
env var)

因此,请确保在链接程序之前执行以下操作:

export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH

更多信息:

查找库,查找库文件的确切路径(so或dll,具体取决于平台)。之后,您仍然需要添加_库来链接到它。当我与另一个图书馆发生此问题时,以下内容对我有效:

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)

查找库,查找库文件的确切路径(so或dll,取决于平台)。之后,您仍然需要添加_库来链接到它。当我与另一个图书馆发生此问题时,以下内容对我有效:

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)

使用
find_library
宏,只能“查找”库。你与此无关。您必须将GLEW_库值添加到
add_库
。你检查过这个了吗?您还可以查看:link_directories(),以确保从/usr/lib64?@P.Brunet链接到glew。我做了
目标链接库(myproject${glew_LIBRARY})
。不确定链接目录,但即使是官方的CMake文档也不鼓励使用it@user3667089,安装具有较新glew的较新版本的ubuntu可能是最容易的。可能不是你想听到的,但我想我会提到它。使用
find_library
宏,你只能“查找”库。你与此无关。您必须将GLEW_库值添加到
add_库
。你检查过这个了吗?您还可以查看:link_directories(),以确保从/usr/lib64?@P.Brunet链接到glew。我做了
目标链接库(myproject${glew_LIBRARY})
。不确定链接目录,但即使是官方的CMake文档也不鼓励使用it@user3667089,安装具有较新glew的较新版本的ubuntu可能是最容易的。可能不是你想听到的,但我想我会提到它..谢谢你的回答,但是/usr/lib64已经被find_library添加到路径中,所以再次添加到LD_library_路径是多余的,只是路径中有两个libGLEW.so(完全相同的名称),不知何故,ubuntu决定从/usr/lib/x86_64-linux-gnu/over/usr/lib64Relink
mylib中选择一个。因此
with
LD_LIBRARY_PATH
set?将/usr/lib64添加到LD_LIBRARY_路径中,但仍然链接错误,LD_LIBRARY_路径的优先级仍然低于默认搜索路径。你试过了吗?谢谢你的回答,但是find_library已经在路径中添加了/usr/lib64,所以再次将它添加到LD_library_路径是多余的,只是路径中有两个libGLEW.so(完全相同的名称),不知何故,ubuntu决定从/usr/lib/x86_64-linux-gnu/over/usr/lib64Relink
mylib中选择一个。因此
with
LD_LIBRARY_PATH
set?将/usr/lib64添加到LD_LIBRARY_路径中,但仍然链接错误,LD_LIBRARY_路径的优先级仍然低于默认搜索路径。你试过了吗?它对你有用吗?