C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如何创建依赖于外部头文件的cmake header-only库?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个具有以下文件结构的项目:
project
 |
 |-------> lib1
 |           |----> lib1.h
 |
 |-------> lib2
 |           |----> lib2.h
 |
 |-------> main.cc

两个libs lib1和lib2只包含头文件,而lib2.h包含lib1.h,main.cc包含lib2.h.

我现在如何为这个项目编写cmake文件我试图为lib2创建一个interface library,但编译器找不到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文件中有什么问题?

解决方法

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

此外,如果要在lib1上为lib2创建依赖关系,则应该通过target_link_libraries来实现:依赖关系不仅包括目录,还包括编译选项,定义,目标属性……

target_sources不适用于接口库.从this answer开始,您可以使用没有命令的自定义目标将源关联到目标而不影响构建过程(对于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中为构建树和安装树指定其他目录(请参阅documentation):

target_include_directories(lib1 INTERFACE
    $<BUILD_INTERFACE:${PROjeCT_sourcE_DIR}/lib1>
    $<INSTall_INTERFACE:${YOUR_INSTall_DIR}/lib1>
)

大佬总结

以上是大佬教程为你收集整理的c – 如何创建依赖于外部头文件的cmake header-only库?全部内容,希望文章能够帮你解决c – 如何创建依赖于外部头文件的cmake header-only库?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。