2014-11-24 77 views
0

这工作正常。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 

回答

0

这是更好地使用FIND_LIBRARY比手动连接。

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

target_link_libraries(my_exe ldap_r) 
+0

这是行不通的。 find_library(LDAP_LIB NAMES ldap_r HINTS/lib64)和消息(“LDAP LIBRARY $ {LDAP_LIB}”)导致以下输出LDAP LIBRARY LDAP_LIB-NOTFOUND。/lib64包含libldap_r-2.4.so.2和libldap_r-2.4.so.2.5.6 – user1766169 2014-11-26 14:00:20

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的寻找libldap_r-2.4.so这是不是在你的/ lib64目录。如果你不介意创建符号链接:

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

然而,正如克里斯蒂安Bidea所说,这是更好地运用FIND_LIBRARY实用。

+0

如果我回显$ LD_LIBRARY_PATH,它显示“:/ usr/local/lib”,并且我链接到不在“/ usr/USR/local/lib目录”。我尝试将/ lib64添加到LD_LIBRARY_PATH,但FIND_LIBRARY仍然找不到该库。 @balajeerc – user1766169 2014-11-28 13:16:53

1

当你试图使用名称ldap_r-2.4链接,链接器将搜索文件与lib前面加上它,默认后缀追加,像.a.so,所以如果你有一个文件名为它会工作libldap_r-2.4.so(这可能是带有版本号的文件的符号链接)在其中一个使用的链接目录中(/lib64很可能包含在系统的默认搜索路径中,所以不需要手动添加它)。

对于我来说,在Ubuntu 14.10中只有叫libldap_r.so一个符号链接,指向libldap_r-2.4.so.2.8.3,所以与此库链接将是正确的做法:

target_link_libraries(my_exe ldap_r) 
+0

感谢您的解释!有一个libldap_r.so,但它指向libldap_r-2.3.so.0.2.15,它不是我想要的版本。 – user1766169 2014-12-05 06:33:12