CMake:没有绝对路径就找不到库

时间:2014-11-24 08:16:58

标签: linux build cmake

这项工作很好。

add_executable( my_exe file.c )
target_link_libraries( my_exe /lib64/libldap_r-2.4.so.2 )

但为什么这不起作用?

link_directories( /lib64 )
add_executable( my_exe file.c )
target_link_libraries(my_exe ldap_r-2.4 )

错误讯息:

/usr/bin/ld: cannot find -lldap_r-2.4

目录/ lib64包含以下文件:

libldap_r-2.4.so.2 -> libldap_r-2.4.so.2.5.6
libldap_r-2.4.so.2.5.6

3 个答案:

答案 0 :(得分:1)

当您尝试使用名称ldap_r-2.4进行链接时,链接器将搜索前缀为lib的文件,并附加默认后缀,例如.a,{ {1}},如果你在其中一个链接目录中有一个名为.so的文件(可能是带有版本号的文件的符号链接),它会起作用(libldap_r-2.4.so是最有可能包含在系统的默认搜索路径中,因此无需手动添加它。

对我来说,在ubuntu 14.10上只有一个名为/lib64的符号链接,指向libldap_r.so,所以链接到这个库的正确方法是:

libldap_r-2.4.so.2.8.3

答案 1 :(得分:0)

最好使用FIND_LIBRARY而不是手动链接。

如果您的库是默认安装的,则不必包含该版本。

target_link_libraries(my_exe ldap_r)

答案 2 :(得分:0)

/ lib64文件夹可能不在链接器搜索路径中。 尝试导出LD_LIBRARY_PATH以包括此项,如下所示。这必须在您要从中调用cmake的同一个shell中完成。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64/

此外,这不起作用:

target_link_libraries(my_exe ldap_r-2.4 )

因为这使得CMake查找不在/ lib64目录中的libldap_r-2.4.so。如果您不介意创建符号链接:

ln -s /lib64/libldap_r-2.4.so.2.5.6 /lib64/libldap_r-2.4.so

然而,正如Cristian Bidea所说,最好使用FIND_LIBRARY实用程序。