Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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链接命令是否仍然需要针对OpenMP::OpenMP_CXX的显式链接?_C++_Gcc_Cmake_Openmp - Fatal编程技术网

C++ 此CMake链接命令是否仍然需要针对OpenMP::OpenMP_CXX的显式链接?

C++ 此CMake链接命令是否仍然需要针对OpenMP::OpenMP_CXX的显式链接?,c++,gcc,cmake,openmp,C++,Gcc,Cmake,Openmp,我正在使用CMake和GNU的并行算法以及我的CMakeLists.txt中的以下代码片段: 这是否使以下命令变得多余 target_link_libraries(MyTarget OpenMP::OpenMP_CXX)? 我曾试图找到答案,但无济于事。在使用message命令打印上述变量的输出时,我看到最后两个是空的 -- OpenMP_CXX_FLAGS are: -fopenmp -- OpenMP_C_FLAGS are: -Xclang -fopenmp -- CMAKE_EXE_

我正在使用CMake和GNU的并行算法以及我的CMakeLists.txt中的以下代码片段:

这是否使以下命令变得多余

target_link_libraries(MyTarget OpenMP::OpenMP_CXX)?
我曾试图找到答案,但无济于事。在使用message命令打印上述变量的输出时,我看到最后两个是空的

-- OpenMP_CXX_FLAGS are: -fopenmp
-- OpenMP_C_FLAGS are: -Xclang -fopenmp 
-- CMAKE_EXE_LINKER_FLAGS are:  
-- OpenMP_EXE_LINKER_FLAGS are:
我试图查找变量定义,但没有找到更多内容。一个小型测试程序,使用:

__gnu_parallel::for_each 
并行运行,无论我是否包括:

target_link_libraries(MyTarget OpenMP::OpenMP_CXX) 
这使我得出结论,这是没有必要的。这是真的吗

我的gcc是g++-9自制gcc 9.3.0_1 9.3.0

谢谢大家!

而代码:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

将用适当的-FOpenMP选项更新C++编译标志,这是一种过时的方法。 通过针对提供的导入目标OpenMP::OpenMP_CXX进行链接,可以实现相同的效果,因为此目标在其INTERFACE_compile_OPTIONS属性中提供了-fopenmp compile选项。同样,此导入的目标根据语言传播您可能需要的任何依赖OpenMP库,否则需要额外的手动步骤链接到${OpenMP_CXX_libraries}。因此,直接链接到导入的目标OpenMP::OpenMP_CXX应该是首选方法;它为您节省了额外的手动步骤,并遵循现代CMake公理:

target_link_libraries(MyTarget PRIVATE OpenMP::OpenMP_CXX)
注意,CMake OpenMP查找模块的官方文档及其提供的变量/目标为。

,而代码:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

将用适当的-FOpenMP选项更新C++编译标志,这是一种过时的方法。 通过针对提供的导入目标OpenMP::OpenMP_CXX进行链接,可以实现相同的效果,因为此目标在其INTERFACE_compile_OPTIONS属性中提供了-fopenmp compile选项。同样,此导入的目标根据语言传播您可能需要的任何依赖OpenMP库,否则需要额外的手动步骤链接到${OpenMP_CXX_libraries}。因此,直接链接到导入的目标OpenMP::OpenMP_CXX应该是首选方法;它为您节省了额外的手动步骤,并遵循现代CMake公理:

target_link_libraries(MyTarget PRIVATE OpenMP::OpenMP_CXX)

注意,CMake OpenMP Find模块的官方文档及其提供的变量/目标是。

使用OpenMP::OpenMP_CXX的后一种形式几乎肯定是首选。你考虑前者有什么原因吗?如果。。。片段,不。如果你写下这个作为答案,那么我将接受它。多行命令中的标志设置是否过时/更容易出错?使用OpenMP::OpenMP_CXX的后一种形式几乎肯定是首选。你考虑前者有什么原因吗?如果。。。片段,不。如果你写下这个作为答案,那么我将接受它。多行命令中的标志设置是否过时/更容易出错?