C++ 此CMake链接命令是否仍然需要针对OpenMP::OpenMP_CXX的显式链接?
我正在使用CMake和GNU的并行算法以及我的CMakeLists.txt中的以下代码片段: 这是否使以下命令变得多余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_
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的后一种形式几乎肯定是首选。你考虑前者有什么原因吗?如果。。。片段,不。如果你写下这个作为答案,那么我将接受它。多行命令中的标志设置是否过时/更容易出错?