我想在子目录中使用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
,因为它隐式添加为Xml
和Websocket
的依赖项。子目录也是如此:add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 QT5::Xml)
这里
exec1
隐式链接到Core
组件,因为它是Xml
的依赖项。