我想在子目录中使用Qt5库而不将所有组件添加到每个子目录中。在父CMakeList中,我使用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时必须列出所有需要的组件。

因此,按照您的示例,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的依赖项。

09-27 18:20