【发布时间】:2021-03-03 04:35:53
【问题描述】:
How to create a cmake header-only library that depends on external header files? 接近但不同。
我有一个单头库MyHeaderLib。在MyHeaderLib/MyHeader.h 我有#include <QString>,所以任何做#include "MyHeaderLib/MyHeader.h" 的人最好在他们的路径中有QString(即,我认为Qt5Core 到CMake(?))并且他们需要链接到Qt5Core。
什么属于我的CMakeLists.txt MyHeaderLib?我有
cmake_minimum_required(VERSION 3.12)
add_library(MyHeaderLib INTERFACE)
target_include_directories(MyHeaderLib include/)
# (^ Where include/ contains MyHeaderLib/MyHeader.h)
我尝试使用target_link_libraries(MyHeaderLib 的任何操作都需要INTERFACE,如果我使用target_link_libraries(MyHeaderLib INTERFACE Qt5Core),这还不够。
最终我让它按如下方式工作,但我不明白发生了什么:
cmake_minimum_required(VERSION 3.12)
find_package(Qt5Core REQUIRED) # <- Can't be Qt5::Core
add_library(MyHeaderLib INTERFACE)
target_include_directories(MyHeaderLib include/)
# (^ Where include/ contains MyHeaderLib/MyHeader.h)
target_link_libraries(MyHeaderLibrary
INTERFACE
Qt5::Core # <- Can't be Qt5Core
)
我收集带有:: 的目标是别名,但我很困惑为什么它需要完全像这样。此外,我在任何地方都找不到add_library(Qt5::Core ALIAS Qt5Core)。到底是怎么回事?为什么我必须find_package(Qt5Core REQUIRED) 而不是find_package(Qt5::Core REQUIRED),为什么target_link_libraries 不能接受Qt5Core?
【问题讨论】:
-
你的意思是CMake的内置Qt支持神奇地知道当我寻找
Qt5Core时我得到Qt5::Core?我是 CMake n00b... 如果一个是另一个的别名,为什么这两个名称不能与find_package和target_link_libraries互换? -
find_package(XYZ ...)可以与您使用target_link_libraries链接到的目标完全不同。在这种情况下,有一个FindQt5Core.cmake(或者可能是Qt5CoreConfig.cmake)声明了Qt5::Core目标。他们本可以编写它来声明Qt5Core,但他们选择将其设为Qt5::Core。