我想在我的子目录中使用 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
,因为它被隐式添加为 Xml
和 Websocket
的依赖项。子目录也是如此:
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/