CMake:无法找到头文件

时间:2017-01-23 19:49:33

标签: c++ cmake ctest

我有一个目录main,它有以下子目录: A,B,C,D,测试。

在测试中,我有一个包含以下内容的CMakeLists文件:

cmake_minimum_required(VERSION 2.8)
enable_testing()
set(TEST_EXE_NAME test)
add_executable(${TEST_EXE_NAME} test.cpp)
add_test(NAME "testDatabase" COMMAND ${TEST_EXE_NAME})
target_include_directories(Test PUBLIC ./)
target_include_directories(Test A B C D)
target_link_libraries(Test A B C D)

在Test中,我有一个可执行文件,其中包含来自A,B,C和D的几个头文件。

然而,在做完之后,我收到消息说cmake无法从A,B,C和D中找到这些头文件。

如何让它消失?

3 个答案:

答案 0 :(得分:2)

第一个参数od target_include_directories是CMake目标,而不是目录,因此您应该使用以下代码(假设${TEST_EXE_NAME}是需要来自A,B,C,D的标头的目标): / p>

target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_include_directories(${TEST_EXE_NAME} PUBLIC A B C D)

答案 1 :(得分:1)

从你的问题来看,很难确切地看出出了什么问题。这就是为什么我要描述如何解决整个问题。

在"目录main"

这里必须有CMakeLists.txt才能在测试中使用CMake目标进行A-D。它看起来像这样:

cmake_minimum_required(VERSION 2.8)
enable_testing()
add_subdirectory(A)
add_subdirectory(B)
add_subdirectory(C)
add_subdirectory(D)
add_subdirectory(Test)

请注意,我们在此处致电enable_testing()。这样您就可以稍后直接在根目录构建目录中调用make test

在文件夹A-D

在那里,您为A-D创建库。 例如,对于A,你会写:

add_library(A STATIC [... source files for A ...]) # or SHARED instead of STATIC
target_include_directories(A PUBLIC ./)

请注意,通过使用target_include_directories,您可以告诉CMake稍后自动包含库的目录。这将在下面有用。

在文件夹Test

现在这变得非常简单:

set(TEST_EXE_NAME test)
add_executable(${TEST_EXE_NAME} test.cpp)
target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_link_libraries(${TEST_EXE_NAME} A B C D)
add_test(NAME "testDatabase" COMMAND ${TEST_EXE_NAME})

请注意,这里不需要为A-D设置包含目录,因为CMake之前已经知道它们是必需的!

答案 2 :(得分:0)

尝试在target_include_directories()行中包含A,B,C和D.如前所述,target_link_libraries()行应该指定,而不是涉及的头文件。