CMake:找不到头文件
CMake: can't find header files
我有一个主目录,其中有以下子目录:
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)
在测试中,我有一个可执行文件,#include 了 A、B、C 和 D 的几个头文件。
但是,在执行 make 后,我收到消息说 cmake 无法从 A、B、C 和 D 中找到这些头文件。
我怎样才能让它消失?
尝试在 target_include_directories() 行中包含 A、B、C 和 D。如前所述,target_link_libraries() 行应该指定 库 ,而不是所涉及的 headers。
第一个参数 od target_include_directories
是 CMake 目标,而不是目录,因此您应该使用以下代码(假设 ${TEST_EXE_NAME}
是需要来自 A、B、 C, D):
target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_include_directories(${TEST_EXE_NAME} PUBLIC A B C D)
从你的问题中,很难看出到底出了什么问题。这就是为什么我要描述我将如何解决整个问题。
在你的"directory main"
这里必须有一个 CMakeLists.txt
才能在测试中使用 A-D 的 CMake 目标。它看起来像这样:
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 稍后自动包含库的目录。这在下面会有用。
在文件夹测试中
现在这变得很容易了:
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 之前已经知道需要它们!
我有一个主目录,其中有以下子目录: 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)
在测试中,我有一个可执行文件,#include 了 A、B、C 和 D 的几个头文件。
但是,在执行 make 后,我收到消息说 cmake 无法从 A、B、C 和 D 中找到这些头文件。
我怎样才能让它消失?
尝试在 target_include_directories() 行中包含 A、B、C 和 D。如前所述,target_link_libraries() 行应该指定 库 ,而不是所涉及的 headers。
第一个参数 od target_include_directories
是 CMake 目标,而不是目录,因此您应该使用以下代码(假设 ${TEST_EXE_NAME}
是需要来自 A、B、 C, D):
target_include_directories(${TEST_EXE_NAME} PUBLIC ./)
target_include_directories(${TEST_EXE_NAME} PUBLIC A B C D)
从你的问题中,很难看出到底出了什么问题。这就是为什么我要描述我将如何解决整个问题。
在你的"directory main"
这里必须有一个 CMakeLists.txt
才能在测试中使用 A-D 的 CMake 目标。它看起来像这样:
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 稍后自动包含库的目录。这在下面会有用。
在文件夹测试中
现在这变得很容易了:
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 之前已经知道需要它们!