2013-03-23 44 views
1

我試圖編譯測試子目錄project/model/tests可執行文件需要鏈接駐留在project/model我的模型文件的可執行文件。但是,我無法讓它工作。我已經成功地將父目錄,但CMake的不斷告訴我發現Foo.cpp中沒有源文件,該文件是在父目錄,而bar.cpp,這是在當前目錄中,正確添加。添加從父目錄cmake的

cmake_minimum_required(VERSION 2.6) 

# get parent directory 
get_filename_component(MODEL_DIR ${CMAKE_CURRENT_SOURCE_DIR} PATH) 

# Locate GTest 
find_package(GTest REQUIRED) 
# Add parent directory 
include_directories(${GTEST_INCLUDE_DIRS} ${MODEL_DIR}) 
link_directories(${MODEL_DIR}) 

# all included directories are printed out correctly 
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) 
foreach(dir ${dirs}) 
    message(STATUS "dir='${dir}'") 
endforeach() 

# foo.cpp, which is in the parent directory is not found 
add_executable(runTests foo.cpp bar.cpp) 

target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 

謝謝。

回答

4

當在add_executable()add_library()中列出的文件被指定爲相對路徑(它們幾乎總是)時,它們被解釋爲相對於CMAKE_CURRENT_SOURCE_DIR。換句話說,你必須做的其中之一:

add_executable(runTests ../foo.cpp bar.cpp) 

或者:

add_executable(runTests ${MODEL_DIR}/foo.cpp bar.cpp) 

附註:這是幾乎從來沒有使用link_directories()一個好主意;該命令通常比它的價值更麻煩。優選的替代方法是提供完全的路徑target_link_libraries()在必要。

+0

謝謝。它現在可以工作:)而且我會嘗試關注你對link_directories的建議。 –

+1

@LimH。給出'link_libraries()'警告的一些基本原理:參見例如[這個問題](http://stackoverflow.com/q/15423821/1782465)例如與它的問題。 – Angew