gpt4 book ai didi

c++ - CMake target_include_directories不会影响头文件

转载 作者:行者123 更新时间:2023-12-02 10:32:18 32 4
gpt4 key购买 nike

我的项目大致如下所示:

├CMakeLists.txt
|
├───ExampleApp
| ├───CMakeLists.txt
| ├───header.hpp
| └───main.cpp
|
└───ExampleLibrary
├───CMakeLists.txt
├───mylib.hpp
└───mylib.cpp

我在根CMakeLists.txt中调用
add_subdirectory(ExampleLibrary)
add_subdirectory(ExampleApp)

要建立该库,我称之为:
add_library(ExampleLibrary
mylib.hpp mylib.cpp
)

最后,在可执行文件中,我尝试执行以下操作:
add_executable(ExampleApp
header.hpp main.cpp
)

target_include_directories(ExampleApp
PRIVATE ${PROJECT_SOURCE_DIR}/ExampleLibrary
)

target_link_libraries(ExampleApp
Path/To/The/Binary/Directory
)

现在,生成文件可以正常生成,并且项目也可以正确生成。但是,当我现在尝试将 mylib.hpp包括在 header.hpp中时,由于无法找到文件 mylib.hpp,我遇到了构建错误。但是我实际上可以在 mylib.hpp中包含 main.cpp,并且该项目可以构建和编译。

我想念什么吗?我以为 target_include_directories()可同时用于 .cpp.hpp文件。

最佳答案

看来您可能没有添加正确的目录作为ExampleApp的包含目录。 PROJECT_SOURCE_DIR变量求值到CMake项目中上次project()调用的目录。您尚未显示此位置,但可以使用CMake项目的目录来确保它是正确的。尝试在${CMAKE_SOURCE_DIR}/ExampleLibrary调用中使用target_include_directories代替:

target_include_directories(ExampleApp
PRIVATE ${CMAKE_SOURCE_DIR}/ExampleLibrary
)

还有一些注意事项:
  • 如果您不使用Visual Studio之类的IDE进行编译,则无需向add_library()add_executable()之类的调用中添加头文件。这样做只能确保它们显示在IDE中。
  • 而是使用target_include_directories()指定可以在其中找到 header 的目录。就您而言,听起来您应该在此处列出两个目录。
  • 要将ExampleLibrary目标链接到可执行文件,您只需在target_link_libraries()中使用目标名称即可。无需列出二进制目录(除非您从那里链接其他库)。

  • 因此,考虑到这一点, ExampleApp CMake文件可能看起来像这样:
    add_executable(ExampleApp
    main.cpp
    )

    target_include_directories(ExampleApp PRIVATE
    ${PROJECT_SOURCE_DIR}/ExampleLibrary
    ${CMAKE_CURRENT_LIST_DIR}
    )

    target_link_libraries(ExampleApp PRIVATE
    ExampleLibrary
    )

    关于c++ - CMake target_include_directories不会影响头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61828152/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com