2013-03-23 42 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