[英]How to create a cmake header-only library that depends on external non-header-only target?
[英]How to create a cmake header-only library that depends on external header files?
我有一个具有以下文件结构的项目:
project
|
|-------> lib1
| |----> lib1.h
|
|-------> lib2
| |----> lib2.h
|
|-------> main.cc
两个libs lib1
和lib2
只包含头文件,而lib2.h
包含lib1.h
, main.cc
包含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文件中有什么问题?
如评论中所述,应为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>
)
我使用了一个空的_only_for_compiling_the_lib.cpp
文件作为最简单和最快速的解决方法,但显然强烈建议使用上述解决方案。
我根本不知道INTERFACE
关键字。
此问题是由INTERFACE库文件的完整路径问题引起的,该问题已在cmake 3.13版中得到修复。
欲了解更多信息: https : //gitlab.kitware.com/cmake/cmake/issues/17556
此页面还包含一个更好理解的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.