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

时间:2017-09-20 22:28:56

标签: 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中使用一次更方便吗?

感谢任何建议和提示。

1 个答案:

答案 0 :(得分:0)

如果你想在子目录中使用Qt5组件,而在根目录CMakeLists.txt中只使用find_package一次 - 这是恕我直言 - 你必须在查找时列出所有想要的组件Qt的。

所以按照你的例子,root 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的依赖关系。