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

C++ 如何创建依赖于外部头文件的仅cmake头文件库?,c++,cmake,C++,Cmake,我有一个文件结构如下的项目: project | |-------> lib1 | |----> lib1.h | |-------> lib2 | |----> lib2.h | |-------> main.cc 两个liblib1和lib2仅包含头文件,而lib2.h包括lib1.h,而main.cc包括lib2.h 现在如何为该项目编写cmake文件?我试图为lib2创建一个函数,但编译器找不到lib

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

project
 |
 |-------> lib1
 |           |----> lib1.h
 |
 |-------> lib2
 |           |----> lib2.h
 |
 |-------> main.cc
两个lib
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)
add_executable(project main.cc)
target_link_libraries(project lib2)
整个项目的CMakeLists.txt:

add_library(lib2 INTERFACE)
target_sources(lib2 INTERFACE lib2.h)
target_include_directories(lib2 INTERFACE ../lib1/lib1.h)
add_executable(project main.cc)
target_link_libraries(project lib2)

cmake文件中有什么问题?

如评论中所述,
目标目录
应该提供一个目录路径,而不是文件路径

此外,如果您想为
lib1
上的
lib2
创建依赖项,您应该通过
target\u link\u库
:依赖项不仅涉及包含目录,还涉及编译选项、定义、目标属性

target\u源
不适用于接口库。从中,您可以使用自定义目标,而不使用命令将源与目标关联,而不会影响构建过程(对于msvc、QtCreator和其他基于GUI的工具,这使得可以通过IDE访问源;对于其他构建工具,这是无用的)

您的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\u include\u目录中为生成树和安装树指定不同的目录(请参阅):

target\u include\u目录(lib1接口
$
$
)

我使用了一个空的
\u only\u来编译\u lib.cpp
文件,作为最简单、最快速的解决方法,但显然强烈建议使用上述解决方案


我只是不知道接口的关键字。

这个问题是由于接口库文件的完整路径问题,在cmake版本3.13中得到了修复

有关更多信息:


此页还包含一个示例,以便于更好地理解。

您能否在
添加可执行文件
中列出您的标题,并删除所有
添加库
?源代码中有一点似乎很奇怪,可以解释问题:
目标包含目录()
仅适用于包含标题文件的目录。所以它应该是
target\u include\u目录(lib2接口../lib1)
。感谢所有评论<不需要代码>目标\源
,因为目标是“接口”类型,并且不是自己编译的。将源代码直接传递到
add_库
甚至会出现以下错误:
add_库接口库不需要源代码参数。
BTW
target_源代码
也需要源代码才能在QtCreator IDE的项目窗格中轻松可见。我正在使用cmake 3.5.1和行
target_链接库(lib2 lib1)
我得到这个错误
接口库只能与target\u link\u库的INTERFACE关键字一起使用
我猜这里的接口库的意思是
lib2
。如果我在
lib1
之前的target\u link\u libraries命令中添加INTERFACE关键字,则可以克服此错误
target\u link\u库(lib2接口lib1)
我仍然不明白其他解决方案是如何工作的,我还是希望使用空cpp