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

编程入门 行业动态 更新时间:2024-10-18 10:20:15
本文介绍了如何创建一个依赖于外部头文件的 cmake 头文件库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a project with the following file structure:

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

lib1lib2 两个库只包含头文件,而 lib2.h 包含 lib1.h,和 main 包括 lib2.h.

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

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

How do I write the cmake file for this project now? I tried to create an interface library for lib2, but the compiler can't find lib1.h. Here are the contents of my cmake files:

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)
target_link_libraries(project lib2)

cmake 文件有什么问题?

What's the problem in the cmake files?

推荐答案

如评论中所述,target_include_directories 应该给出一个目录的路径,而不是文件的路径.

As stated in the comments, target_include_directories should be given a path to a directory, not to a file.

此外,如果你想在 lib1 上为 lib2 创建一个依赖,你应该通过 target_link_libraries 来做:一个依赖不仅是关于包含目录,还有关于编译选项、定义、目标属性...

Moreover, if you want to create a dependency for lib2 on lib1, you should do it through target_link_libraries: a dependency is not only about include directories, but also about compile options, definitions, target properties...

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

target_sources doesn't work with interface libraries. From this answer, You can use a custom target without commands to associate the sources to a target without impacting the build process (for msvc, QtCreator and other GUI-based tools, this makes the sources accessible through the IDE; AFAIK it's useless for other build tools).

您的 cmake 可能如下所示:

Your cmake may look like this:

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)
target_link_libraries(project lib2)

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

Advanced tip: you can specify a different directory in target_include_directories for the build tree and the install tree (see documentation):

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

这篇关于如何创建一个依赖于外部头文件的 cmake 头文件库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

更多推荐

[db:关键词]

本文发布于:2023-03-31 04:26:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/795879.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:头文件   创建一个   依赖于   cmake

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!