Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cmake和Qt5:在不同的子目录中使用Qt5的不同组件_C++_Qt_Cmake_Qt5 - Fatal编程技术网

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

C++ Cmake和Qt5:在不同的子目录中使用Qt5的不同组件,c++,qt,cmake,qt5,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) project(exec1)

我想在我的子目录中使用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) 
project(exec1)
set(SRC exec1.cpp)
set(HDR exec1.h)

add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 Qt5::Core Qt5::Xml)
project(exec2)
set(SRC exec2.cpp)
set(HDR exec2.h)

add_executable(exec2 ${SRC} ${HDR})
target_link_libraries(exec2 Qt5::Core Qt5::Websockets)
在子目录
exec1
中,我想使用
Qt5::Xml
组件。据我所知,CMake将
Qt5_DIR
变量传递到子目录。因此,我不必再次使用
find_package
。这个假设正确吗?例如:

exec1/CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

find_package(Qt5 COMPONENTS Core REQUIRED)

add_subdirectory(exec1)
add_subdirectory(exec2) 
project(exec1)
set(SRC exec1.cpp)
set(HDR exec1.h)

add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 Qt5::Core Qt5::Xml)
project(exec2)
set(SRC exec2.cpp)
set(HDR exec2.h)

add_executable(exec2 ${SRC} ${HDR})
target_link_libraries(exec2 Qt5::Core Qt5::Websockets)
在第二个子目录
exec2
中,我想添加Qt5的其他组件。例如:

exec2/CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

find_package(Qt5 COMPONENTS Core REQUIRED)

add_subdirectory(exec1)
add_subdirectory(exec2) 
project(exec1)
set(SRC exec1.cpp)
set(HDR exec1.h)

add_executable(exec1 ${SRC} ${HDR})
target_link_libraries(exec1 Qt5::Core Qt5::Xml)
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_包
添加到每个子目录而不是在父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
的依赖项。请注意,它是
Qt5
,而不是
Qt5
。这对区分大小写的文件系统(像大多数Linuxes一样)有很大影响。谢谢你的建议。我在问题中改了。