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
两个liblib1
和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_库接口库不需要源代码参数。
BTWtarget_源代码
也需要源代码才能在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