2017-08-28 50 views
0

我想鏈接到使用CMake的共享庫。我知道這可以通過使用target_link_libraries()命令來實現。我已經能夠得到這個工作,但不是我想要的方式。如何使用CMake指定在哪裏查找共享庫?

使用下面的CMakeLists.txt,我已經能夠鏈接到共享庫。

cmake_minimum_required(VERSION 3.7) 
project(DylibTest) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp) 
add_executable(DylibTest ${SOURCE_FILES}) 

target_link_libraries(DylibTest 
${CMAKE_SOURCE_DIR}/Resources/libDynamicTest.dylib) 

這似乎告訴鏈接器查看該項目所在的目錄。這對開發很好,但我將如何分發此項目?最終用戶顯然不會擁有這個相同的文件夾。

我試過在一個相對路徑來傳遞,像這樣:

cmake_minimum_required(VERSION 3.7) 
project(DylibTest) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp) 
add_executable(DylibTest ${SOURCE_FILES}) 

target_link_libraries(DylibTest /Resources/libDynamicTest.dylib) 

做這件事時,我得到以下錯誤:

No rule to make target `/Resources/libDynamicTest.dylib', needed by `DylibTest'. Stop. 

我看過的target_link_directories文檔()但它沒有幫助。我也看了很多其他的問題。

如果不清楚,我的意圖是將可執行文件分發到名爲「Resources」的文件夾中,該文件夾包含共享庫。我的CMakeLists.txt文件應該如何查看才能執行此操作?

編輯:在回答這個問題被標記爲可能的重複的this question,我不承認,這個問題基本上是問同樣的事情,答案有沒有爲我工作。

這裏是我的CMakeLists.txt外觀上的其他問題想要一個公認的答案後:

cmake_minimum_required(VERSION 3.7) 
project(DylibTest) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp) 
add_executable(DylibTest ${SOURCE_FILES}) 

link_directories(${CMAKE_BINARY_DIR}/Resources) 
target_link_libraries(DylibTest DynamicTest) 

這不幸的是不會在一個錯誤,指出圖書館找不到工作的結果。

回答

1

看看https://cmake.org/cmake/help/v3.0/command/find_library.html

您可以爲cmake指定一個或多個替代搜索文件夾來查找庫。它也在您的操作系統的默認庫文件夾中查找。

find_library(YOURLIB 
     NAMES your // without the lib 
     PATHS ${CUSTOM_LIB_PATH}) 

可以再用

target_link_library(targetname ${YOURLIB}) 
+0

這個鏈接庫。 'find_library'也會爲你添加'.dylib'後綴,讓你的構建更加便攜。除了CMake變量,您還可以使用環境變量作爲庫位置的提示,這非常方便,特別是如果同一個庫必須被機器上的多個項目使用。但請注意,如果庫是作爲與依賴的可執行文件相同的版本的一部分構建的,則此方法不會*工作,因爲運行CMake時庫文件需要存在。 – ComicSansMS

相關問題