Cmake 和 Qt5:在不同的子目录中使用 Qt5 的不同组件

Cmake and Qt5: Using different components of Qt5 in different subdirectories

本文关键字:Qt5 组件 Cmake 子目录      更新时间:2023-10-16

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

CMakeList.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)

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

任何建议和提示都值得赞赏。

如果你想在子目录中使用Qt5组件,同时在根CMakeList中只使用一次find_package.txt - 恕我直言,这是正确的做法 - 在查找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的依赖项。