2015-04-21 85 views
1

我正在研究一個主項目,有幾個第三方庫。爲了清晰起見,我的目標是將所有這些導入導入目標,但我無法讓其工作。它基本上是一組靜態庫(.lib/lib .a)及其頭文件。通過導入的目標將靜態庫鏈接到主項目

爲了討論起見,Main是主要目標,第三個是進口第三方。

我設法在Windows上生成一個合適的Visual Studio解決方案,但是在Linux上沒有按照預期工作。當構建解決方案,我結束了這個錯誤:

"No rule to make target 'Third-NOTFOUND', needed by '../Bin/Main'" 

下面是我的CMakeLists.txt的一些代碼段。

主要的的CMakeLists.txt:

project(Main) 
[...] 
add_subdirectory(ThirdParty/Third) 
set_property(TARGET Third PROPERTY FOLDER "thirdparty") 
[...] 
add_executable(Main ${SOURCES}) 
target_link_libraries(Main PRIVATE Third) 

第三的的CMakeLists.txt:

project(Third) 
[...] 
# Helper function 
function(append_lib target lib_debug_dir lib_release_dir name) 
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_DEBUG "${lib_debug_dir}/${LIB_NAME}") 
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_RELEASE "${lib_release_dir}/${LIB_NAME}") 
endfunction() 
[...] 
add_library(Third STATIC IMPORTED GLOBAL) 
set_property(TARGET Third APPEND PROPERTY PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}") 

append_lib(Third ${LIB_DIR_DEBUG} ${LIB_DIR_RELEASE} libMyLib1.a) 

注:Linux和Windows的代碼是一樣的,除了靜態庫它自己的名字( MyLib1.lib替換libMyLib1.a)

我在做什麼錯?謝謝:)

+0

這是路徑問題嗎?這個答案是否適用於你:http://stackoverflow.com/questions/14077611/how-do-i-tell-cmake-to-link-in-a-static-library-in-the-source-directory –

+0

I不這麼認爲。我剛剛檢查過,這些都是正確的絕對路徑。 –

+0

如果你檢查生成的Makefile,你會看到那裏的絕對路徑嗎? –

回答

2

儘管我找不到一種方法可以在兩個系統上工作,但我終於設法得到我想要的東西。

在Windows上,我堅持我在我的問題中描述的內容。

在Linux上,我發現了一些解決方法。我將導入一個庫作爲IMPORTED_LOCATION,將所有其他庫導入爲INTERFACE_LINK_LIBRARIES。這並不好,但是如果我不指定導入的位置,我會得到Third-NOTFOUND錯誤。

正如Antonio所說,我使用CMAKE_BUILD_TYPE來鏈接不同配置的不同庫。

謝謝你們兩位的幫助!

0

如果它在Windows而不是Unix中工作,那很可能是因爲路徑大小:即在文件夾名稱中使用大寫和小寫字符不一致。這是不能容忍的Windows,但無情的處罰Unix的:)

解決方案:檢查你是如何拼寫thirdparty各地的項目(在這裏我看到thirdpartyThirdParty)。

+0

謝謝你的回答! 我已經仔細檢查了每條路徑,我是肯定的,他們是正確的,即使考慮到套管陷阱(已經陷入了這個問題:P) 但是,問題似乎來自我正在使用的屬性。 IMPORTED_LOCATION_DEBUG/RELEASE導致第三NOTFOUND錯誤。 使用IMPORTED_LOCATION種類解決了這個問題(雖然不能爲不同的配置指定不同的庫),但是追加所有這些都在 /CMakeFiles/Main.dir/link.txt中添加了以下選項: -o「/libLib1 .a; /libLib2.a; [...]「 這導致找不到lib的錯誤... –

+0

刪除雙引號並用空格替換逗號可以解決問題。我正在尋找一種方法來現在添加幾個IMPORTED_LOCATION(並且仍在尋找一種差異化調試和發佈配置:) –

+0

@AlexandreZ。你在指定構建類型嗎?向cmake命令行添加類似-DCMAKE_BUILD_TYPE = Debug或-DCMAKE_BUILD_TYPE = Release的內容(或者從cmake-gui中設置它,事實上它更容易)。 – Antonio

相關問題