2014-11-24 137 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