c++ - 使用此 CMake 链接命令仍然需要针对 OpenMP::OpenMP_CXX 的显式链接吗?

标签 c++ gcc cmake openmp

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

if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif().

这会使以下命令变得多余吗?

target_link_libraries(MyTarget OpenMP::OpenMP_CXX)?

我试图找到答案here但无济于事。使用 message 命令打印上述变量的输出后,我发现最后两个是空的。

-- OpenMP_CXX_FLAGS are: -fopenmp
-- OpenMP_C_FLAGS are: -Xclang -fopenmp 
-- CMAKE_EXE_LINKER_FLAGS are:  
-- OpenMP_EXE_LINKER_FLAGS are:

我尝试查找变量定义here但没有发现更多的东西。一个小测试程序使用:

__gnu_parallel::for_each 

无论我是否包含,都并行运行:

target_link_libraries(MyTarget OpenMP::OpenMP_CXX) 

这让我得出结论:这是没有必要的。这是真的吗?

我的gccg++-9(Homebrew 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 编译选项 属性。同样,此导入的目标会传播您可能需要的任何依赖 OpenMP 库(取决于语言),否则需要额外的手动步骤来链接到 ${OpenMP_CXX_LIBRARIES}。因此,直接链接到导入的目标 OpenMP::OpenMP_CXX 应该是首选方法;它为您节省了额外的手动步骤并遵循现代 CMake 公理:

target_link_libraries(MyTarget PRIVATE OpenMP::OpenMP_CXX)

注意,CMake OpenMP 查找模块及其提供的变量/目标的官方文档是 here .

关于c++ - 使用此 CMake 链接命令仍然需要针对 OpenMP::OpenMP_CXX 的显式链接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62475273/

相关文章:

linux - GCC 编译因 pthread 和选项 std=c99 而失败

Qt Creator 使用 cmake 自动完成

c++ - include "file.h"vs <file> 有什么区别?

c++ - Boost 二进制文件读取错误 unsupported version

c - tcc 中的空指针检测

c++ - 将使用 CMake 的大型 C++ 项目编译为 WebAssembly

Android Studio - 没有将 C++ 链接到 Gradle 的选项

c++ - 使用函数从 C++ 中的数组中删除 2 个或更多元素的序列?

c++ - 初始化错误 : How to create a multi dimensional zero array in C++

c++ - GCC C++14/17 成员函数指针模板参数的区别