CMake:找不到头文件

新手上路,请多包涵

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

在测试中,我有一个包含以下内容的 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)

在测试中,我有一个可执行文件,其中 #includes 来自 A、B、C 和 D 的几个头文件。

但是,在 make 之后,我收到 cmake 无法从 A、B、C 和 D 中找到这些头文件的消息。

我怎样才能让它消失?

原文由 user6683825 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

从您的问题中,很难看出到底出了什么问题。这就是为什么我要描述我将如何解决整个问题。

在您的“目录主目录”中

必须有一个 CMakeLists.txt 才能在测试中使用 AD 的 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

在文件夹 AD

在那里,您为 AD 创建库。例如,对于 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})

请注意,这里不需要为 AD 设置包含目录,因为 CMake 之前已经知道需要它们!

原文由 oLen 发布,翻译遵循 CC BY-SA 3.0 许可协议

第一个参数 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)

原文由 Marcin Sucharski 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题