2017-03-09 85 views
0

我對CMake相對較新,我開發了一個小型項目,它構建了一個鏈接到共享庫的庫,名爲external_library。我CMakeLists.txt文件看起來是這樣的:cmake:「make install」不會鏈接到Ubuntu中的庫

cmake_minimum_required(VERSION 2.8.12) 
project(project_name) 

include_directories(path_to_external_library_source_code) 
add_subdirectory(path_to_external_library_header_files subproject/external_library) 

target_link_libraries(project_name external_library) 
install(TARGETS project_name DESTINATION installation_path) 

當我建項目(使用make),它完美的作品,並正確創建的鏈接(我與ldd命令檢查的話)。但是,當我嘗試安裝它時(使用make install),安裝路徑中生成的文件未鏈接到指定的共享庫。

再次使用ldd我已檢查共享庫未在安裝路徑中生成的庫中找到,儘管它在構建路徑中生成的庫中找到。我怎麼能解決這個問題?

謝謝。

Pd:我在Ubuntu 16.04.2 LTS中使用CMake 3.5.1

+1

你覺得'add_subdirectory(path_to_external_library_header_files subproject/external_library)'做了什麼? 'path_to_external_library_header_files'中是否有CMakeLists.txt文件?你爲什麼試圖把外部圖書館作爲一部分的工作項目? – kdopen

+0

是的,在'path_to_external_library_header_files'中有'CMakeLists.txt',它將共享庫的'.cpp'和'.h'文件添加到項目中。 – GLR

+0

我想讓共享庫成爲創建的庫的一部分,這就是爲什麼我使用'add_subdirectory'(我希望我做的是正確的)。 – GLR

回答

0

我已發現,這個問題可以使用命令find_library來解決,指定內置共享庫的路徑,做這樣的事情:

cmake_minimum_required(VERSION 2.8.12) 
project(project_name) 

include_directories(path_to_external_library_source_code) 
find_library(LIBNAME LibName_1 LibName_2 HINTS built_lib_directory)  

target_link_libraries(project_name ${LIBNAME}) 
install(TARGETS project_name DESTINATION installation_path) 
1

共享庫在某些路徑,在配置尋找/etc/ld.so.conf

如果您的共享庫位於其中一個路徑中,應該找到它。如果是在這些路徑之一不,您有四個選項:

  1. 安裝在系統默認路徑庫(這可能是不希望與實驗軟件,甚至有可能給您的權限);
  2. 編輯系統範圍的搜索路徑(不是真的需要觸摸系統範圍的設置,也許是不可能的,因爲權限),
  3. 設置LD_LIBRARY_PATH(不推薦,因爲它覆蓋系統的搜索路徑,這是一個調試功能基本上)或
  4. 設置一個RPATH,即「告訴」/「硬編碼」二進制文件在哪裏尋找它的庫。

會發生什麼事是,CMake的自動設置你的二進制文件的RPATH,引用從項目的共享庫${CMAKE_BINARY_DIR}建立。 (您想測試對你剛建庫,而不是你昨天安裝了一個二進制文件。)

默認情況下,這個RPATH設置通過make install清除(所以${CMAKE_BINARY_DIR}庫不再被引用,並而是在系統搜索路徑中搜索)。

假設您正在安裝到系統搜索路徑中的目標而不是,那麼您的二進制文件現在不再「看到」其共享庫。請參考CMake RPATH handling 讓CMake將您的二進制文件的RPATH設置爲共享庫的安裝路徑。