c++ - CMake 和 Qt5 : Using different components of Qt5 in different subdirectories

标签 c++ qt cmake qt5

我想在我的子目录中使用 Qt5 库,而不需要将所有组件添加到每个子目录。在父 CMakeLists 中,我使用 find_package(Qt5) 来确保库存在并且设置了 Qt5_DIR 变量。示例:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

find_package(Qt5 COMPONENTS Core REQUIRED)

add_subdirectory(exec1)
add_subdirectory(exec2) 

在子目录exec1 中,我想使用Qt5::Xml 组件。据我了解 CMake,Qt5_DIR 变量被传递到子目录。因此我不必再次使用 find_package。这个假设是否正确?示例:

exec1/CMakeLists.txt

project(exec1)
set(SRC exec1.cpp)
set(HDR exec1.h)

add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 Qt5::Core Qt5::Xml)

在第二个子目录 exec2 中,我想添加 Qt5 的其他组件。示例:

exec2/CMakeLists.txt

project(exec2)
set(SRC exec2.cpp)
set(HDR exec2.h)

add_executable(exec2 ${SRC} ${HDR})
target_link_libraries(exec2 Qt5::Core Qt5::Websockets)

如果我在父 CMakeLists.txt 中添加所有组件而不是为每个子项目只选择一些组件,这会有什么不同吗? 我该如何处理这种情况,以便我可以在不影响其他子目录的情况下交换子目录中的 Qt5 组件? 还是将 find_package 添加到每个子目录而不是在父 CMakeLists.txt 中使用一次更方便?

如有任何建议和提示,我们将不胜感激。

最佳答案

如果您想在子目录中使用 Qt5 组件,同时在根目录 CMakeLists.txt 中仅使用一次 find_package——恕我直言,这是正确的做法——您将必须列出所有需要的组件找到 Qt 时的组件。

所以按照你的例子,根 CMakeLists.txt 应该是这样的:

cmake_minimum_required(VERSION 3.0)

find_package(QT5 COMPONENTS Xml Websocket REQUIRED)

add_subdirectory(exec1) # will use Xml
add_subdirectory(exec2) # will use Websocket

请注意,我删除了 Core,因为它被隐式添加为 XmlWebsocket 的依赖项。子目录也是如此:

add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 QT5::Xml)

此处 exec1 隐式链接到 Core 组件,因为它是 Xml 的依赖项。

关于c++ - CMake 和 Qt5 : Using different components of Qt5 in different subdirectories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46332672/

相关文章:

c++ - bool 值,如果为假则重复某些功能

c++ - Qt 如何设置最小化的子窗口出现在父窗口内?

qt - 如何使 QML WebView 元素对所有 'new windows' 使用 Qt::openUrlExternally ?

xcode - 使用 CMake 为多个可执行文件添加不同的 Xcode 资源

Android NDK 交叉编译 sys/signal.h : No such file or directory

cmake - CMake:如何更改单个目标的编译器

c++ - 调试 .Net 和 C++ 应用程序

c++ - 作为非类型模板参数的常量字符串引用

c++ - 为什么QSharedPointer类中没有重载运算符T*()

c++ - operator+ 的重载有什么问题?