我正在尝试编译子目录中的可执行文件project/model/tests
进行测试,需要链接我的模型文件project/model
.但是,我无法让它发挥作用.我已经成功添加了父目录,但是cmake一直告诉我没有找到foo.cpp的源文件,它位于父目录中,而正确添加了当前目录中的bar.cpp.
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)
Run Code Online (Sandbox Code Playgroud)
谢谢.
当列出的文件add_executable()
和add_library()
作为相对路径(它们几乎总是如此)给出时,它们将相对于它们进行解释CMAKE_CURRENT_SOURCE_DIR
.换句话说,您必须执行以下操作之一:
add_executable(runTests ../foo.cpp bar.cpp)
Run Code Online (Sandbox Code Playgroud)
要么:
add_executable(runTests ${MODEL_DIR}/foo.cpp bar.cpp)
Run Code Online (Sandbox Code Playgroud)
旁注:使用它几乎不是一个好主意link_directories()
; 这个命令在一般情况下比它的价值更麻烦.首选的替代方案是target_link_libraries()
在必要时提供完整的路径.