【问题标题】:CMake: can't find header filesCMake:找不到头文件
【发布时间】:2017-01-23 19:49:32
【问题描述】:

我有一个目录 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)

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

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

我怎样才能让它消失?

【问题讨论】:

  • A、B、C 和 D 在您的问题中显示为目录名称和库名称,但您的问题询问的是标题。
  • 我没有看到您在任何地方包含 A、B、C 或 D 的标题。
  • @JoelCornett 抱歉,我指的是 A 中的文件,例如 A.h、B.h 等

标签: c++ cmake ctest


【解决方案1】:

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

在您的“目录主目录”中

这里必须有一个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 之前已经知道需要它们!

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!当我这样做时,我收到“使用无效参数调用 target_include_directories”的消息。你对此有什么建议吗?
    • 尝试在第二行的A 之前添加PUBLIC
    【解决方案3】:

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

    【讨论】:

    • 我刚刚尝试过并更新了问题以反映这一点,但收到“使用无效参数调用 target_include_directories”的消息。你有什么其他的建议?谢谢!
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多