如何创建依赖于外部头文件的 cmake 仅头文件库?

新手上路,请多包涵

我有一个具有以下文件结构的项目:

 project
 |
 |-------> lib1
 |           |----> lib1.h
 |
 |-------> lib2
 |           |----> lib2.h
 |
 |-------> main.cc

The two libs lib1 and lib2 only contain header files while lib2.h includes lib1.h , and main.cc includes lib2.h

我现在如何为这个项目编写 cmake 文件?我试图为 lib2 创建一个 接口库,但是编译器找不到 lib1.h 。以下是我的 cmake 文件的内容:

lib2 的 CMakeLists.txt:

 add_library(lib2 INTERFACE)
target_sources(lib2 INTERFACE lib2.h)
target_include_directories(lib2 INTERFACE ../lib1/lib1.h)

整个项目的 CMakeLists.txt:

 add_executable(project main.cc)
target_link_libraries(project lib2)

cmake 文件有什么问题?

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

阅读 653
1 个回答

如评论中所述,应为 target_include_directories 提供目录的路径,而不是文件的路径。

此外,如果你想在 lib2 创建一个依赖 lib1 ,你应该通过 target_link_libraries 来完成:依赖项不仅包括目录,还包括目录关于编译选项、定义、目标属性…

target_sources 不适用于接口库。从 这个答案 中,您可以使用不带命令的自定义目标将源关联到目标而不影响构建过程(对于 msvc、QtCreator 和其他基于 GUI 的工具,这使得源可以通过 IDE 访问;AFAIK 它对其他构建工具)。

您的 cmake 可能如下所示:

 add_library(lib1 INTERFACE)
target_sources(lib1 INTERFACE lib1.h)

target_include_directories(lib1 INTERFACE
    "${PROJECT_SOURCE_DIR}/lib1"
)

add_library(lib2 INTERFACE)
if(MSVC)
    add_custom_target(lib2.headers SOURCES lib2.h)
endif()

target_include_directories(lib2 INTERFACE
    "${PROJECT_SOURCE_DIR}/lib2"
)

target_link_libraries(lib2 INTERFACE lib1)

add_executable(project main.cc)
target_link_libraries(project lib2)

高级提示:您可以在 target_include_directories 中为构建树和安装树指定不同的目录(参见 文档):

 target_include_directories(lib1 INTERFACE
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/lib1>
    $<INSTALL_INTERFACE:${YOUR_INSTALL_DIR}/lib1>
)

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

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