2017-09-04 83 views
-1

我有一個包含多個源文件的項目,並且我正在使用GoogleTest庫爲其中一些源文件創建單元測試。這些測試都是單獨的.cpp文件,每個文件都包含要測試的相應源文件的標題。CMake - 僅在需要時將庫鏈接到可執行文件

我想爲每個單元測試創​​建一個單獨的可執行文件。爲此,我有一個循環,爲test_sources列表中的每個成員創建可執行文件,並根據test_names列表對其進行命名。

問題是,我的幾個單元測試需要另一個第三方庫。該庫在${${PROJECT_NAME}_EXTERNAL_LIBRARIES})列表中定義。我曾嘗試此鏈接到我的文字的可執行文件,但我得到的錯誤:

Error: No rule to make target 'PocoNetExternal/Foundation/libPocoFoundationd.so', needed by 'StringExTest'. Stop. 

這是因爲StringExTest是不需要POCO庫的測試之一。如果我刪除了POCO的鏈接,那麼對於需要POCO的可執行文件,我得到一個undefined reference錯誤。有趣的是,如果我把鏈接放回去,並再次編譯,所有編譯和運行正常,沒有錯誤。不幸的是,這還不夠好,因爲我需要它第一次工作,所以它在我們的持續集成服務器上工作。

以下是將Gtest和Poco鏈接到可執行文件的代碼。如何改變這種情況,只有在需要時才鏈接POCO?如果添加或刪除其他測試,則此代碼也可以在不進行修改的情況下重複使用。

########################################################################## 
##### Loop over all the .cpp files and create separate executables 

list(LENGTH test_sources len1)    #len1 is length of test_sources list 
math(EXPR len2 "${len1} - 1")    #len2 is len1 - 1 

foreach(val RANGE ${len2})    #for val = 0 to len2 
    list(GET test_names ${val} name)   #name will change on every loop 
    list(GET test_sources ${val} src)   #list(GET <list> <element index> <output variable>) 
    add_executable("${name}" "${src}" "${test_files}") #add_executable(<name> source1 [source2 ...]) 
endforeach() 

########################################################################## 
###### Link the libraries 

makeLibPathsAbsolute() 

foreach(val RANGE ${len2})       #for val = 0 to len2 
    list(GET test_names ${val} name)     #name will change on every loop 
    target_link_libraries(${name} gtest_main)    #link gtest libraries 
    message(STATUS "LINKING: ${external_libraries_abs} to ${name}\n") 
    target_link_libraries(${name} ${external_libraries_abs}) #link all other libraies (give the absolute path path) 
endforeach() 
+0

@Frank它相對於'StringExTest'所需的'錯誤日誌狀態' – Blue7

+0

'',但是你寫'StringExTest是不需要POCO庫的測試之一'相對於'$ {PROJECT_BINARY_DIR}/$ {EXTERNAL_NAME} 。那麼是哪一個呢? – VTT

+0

@VTT錯誤日誌認爲它需要POCO庫,因爲它正在鏈接到可執行文件。但是,StringExTest絕對不需要POCO。 – Blue7

回答

2

將完整路徑傳遞到target_link_libraries()。通過使用get_filename_component()ABSOLUTE arg,您可以製作絕對路徑${PROJECT_NAME}_EXTERNAL_LIBRARIES

+0

謝謝你的回答。您能否擴展如何將相對路徑與絕對路徑相結合?我在這裏創建了一個新問題:https://stackoverflow.com/questions/46041606/cmake-make-a-list-of-paths-absolute – Blue7

+0

這很好用,謝謝! – Blue7

+0

對不起,我說得太快了!如果我刪除了構建文件夾並嘗試從頭開始重新構建,則會得到與原始問題相同的錯誤。現在它也絕對將絕對路徑傳遞給目標鏈接庫。 – Blue7

相關問題