我有一個包含多個源文件的項目,並且我正在使用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()
@Frank它相對於'StringExTest'所需的'錯誤日誌狀態' – Blue7
'',但是你寫'StringExTest是不需要POCO庫的測試之一'相對於'$ {PROJECT_BINARY_DIR}/$ {EXTERNAL_NAME} 。那麼是哪一個呢? – VTT
@VTT錯誤日誌認爲它需要POCO庫,因爲它正在鏈接到可執行文件。但是,StringExTest絕對不需要POCO。 – Blue7