2017-04-11 29 views
0

我有cmake的項目針對的共享對象鏈接是非常看起來像這樣:導演的cmake與調試後綴(_D)

cmake_minimum_required(VERSION 3.0) 

SET(CMAKE_DEBUG_POSTFIX "_d") 

include_directories(../TransfunctionerProject) 
include_directories(../TransmogrifierProject) 

set(Libraries 
    ContinuumTransfunctioner 
    Transmogrifier 
) 

set(SourceFiles 
    Wrapper.cpp 
    Logger.cpp 
) 

add_library(Frobnigator SHARED ${SourceFiles}) 
add_library(FrobnigatorStatic STATIC ${SourceFiles}) 
set_target_properties(FrobnigatorStatic PROPERTIES OUTPUT_NAME Frobnigator) 
target_link_libraries(Frobnigator ${Libraries}) 

凡ContinuumTransfunctioner和Transmogrifier項目包括調試後綴指令SET(CMAKE_DEBUG_POSTFIX "_d")使libContinuumTransfunctioner_d.solibTransmogrifier_d.so都存在。

的問題是,當前的項目似乎鏈接對靜態庫沒有_D後綴,並抱怨:

/usr/bin/ld: cannot find -lContinuumTransfunctioner 
+0

你可以張貼鏈接級的輸出,如果你使用詳細= 1運行cmake,它會更容易找到解決方案,驗證可能的錯誤。 –

+0

另外,你確定你用-DCMAKE_BUILD_TYPE = Debug配置了cmake嗎? –

+0

@TomazCanabrava是cmake配置了-DCMAKE_BUILD_TYPE = Debug'(這是默認的innit?)。 '使VERBOSE = 1'鏈接'-lContinuumTransfunctioner -lTransmogrifier'。 – Olumide

回答

0

這裏的解決方案,良好的人的禮貌對cmake mailing list

# Note: 
# $<$<CONFIG:Debug>:_d> is called a generator expression. 
# It outputs _d if the build is debug. 
# 
set(Libraries 
    ContinuumTransfunctioner$<$<CONFIG:Debug>:_d> 
    Transmogrifier$<$<CONFIG:Debug>:_d> 
) 
0

您傳遞到target_link_libraries調用的Libraries被解釋爲文件名,而不是目標名稱。這是CMake中該調用的不幸回退:如果你傳遞一個隨機字符串給它,那不能以有意義的方式解釋,CMake將總是假定它是純文本庫名稱。有時這只是你想要的,但名稱必須與現有庫完全匹配。整個調試後綴魔術將在這裏丟失。

你可能想要做的是通過一個庫目標名稱來代替。這將觸發一個更明智的處理依賴關係,並將解決您的問題。但是,只有當庫在target_link_libraries調用的情況下是已知目標時才起作用。你可以很容易地檢查如下:

if(TARGET ContinuumTransfunctioner) 
    message("Library target name") 
else() 
    message("Plain library name") 
endif() 
target_link_libraries(Frobnigator ContinuumTransfunctioner) 

那麼你如何到達目標名稱的情況?這取決於你的構建的結構。如果庫是作爲CMake運行的一部分構建的,只需確保相應的add_library調用是從執行target_link_libraries調用的文件通過add_subdirectory拉入的子目錄執行的。

如果問題庫是外部依賴項,您需要構建一個imported target,其中攜帶了查找庫文件(包括任何潛在調試後綴)的所有相關信息。手動操作可能有點麻煩,所以如果可以的話,您可能想要使用CMake的packaging mechanism作爲庫的構建過程的一部分自動生成。

+0

@ComicsSansMS我有「圖書館目標名稱」。庫ContinuumTransfunctioner和Frobnigator不是作爲Frobnigator的一部分構建的。我應該特別關注包裝機構的哪些特徵? – Olumide

+0

@Olumide關於創建包的部分應該特別感興趣,但要確保你也瞭解'find_package'在這種情況下的工作原理。請注意,雖然這是一個非常複雜的話題,並不是因爲心靈的f弱。 – ComicSansMS