在Mac OS X Mojave上使用AppleClang编译和链接OpenMP

3
我一直在尝试使用CLion IDE,在 Mac OS X 10.14.5 Mojave 上使用 AppleClang 编译一个简单的 OpenMP 程序。

main.cpp:

#include <omp.h>
#include <iostream>

int main() {
    std::cout << omp_get_max_threads() << std::endl;
    return 1;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(OpenMPTest)

set(CMAKE_CXX_STANDARD 17)

add_executable(OpenMPTest main.cpp)

find_package(OpenMP)
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()

CMake输出:
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /Users/bully/CLionProjects/OpenMPTest
-- The C compiler identification is AppleClang 10.0.1.10010046
-- The CXX compiler identification is AppleClang 10.0.1.10010046
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenMP_C: -Xclang -fopenmp (found version "3.1") 
-- Found OpenMP_CXX: -Xclang -fopenmp (found version "3.1") 
-- Found OpenMP: TRUE (found version "3.1")  
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/bully/CLionProjects/OpenMPTest/cmake-build-debug

当我构建项目时,我收到一个链接器错误:
====================[ Build | all | Debug ]=====================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/bully/CLionProjects/OpenMPTest/cmake-build-debug --target all -- -j 2
Scanning dependencies of target OpenMPTest
[ 50%] Building CXX object CMakeFiles/OpenMPTest.dir/main.cpp.o
[100%] Linking CXX executable OpenMPTest
Undefined symbols for architecture x86_64:
  "_omp_get_max_threads", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [OpenMPTest] Error 1
make[1]: *** [CMakeFiles/OpenMPTest.dir/all] Error 2
make: *** [all] Error 2

为什么这个不起作用?从命令行运行clang++ main.cpp -lomp成功后,我使用open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg安装了库头文件。 message(STATUS "Linker flags:" "${OpenMP_EXE_LINKER_FLAGS}") 打印:
-- Linker flags:

如果我用 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lomp") 替换 CMAKE_EXE_LINKER_FLAGS 设置器,编译和链接就可以工作。为什么我必须手动指定呢?以平台无关的方式使其工作的首选方法是什么?-fopenmp 会产生 clang: error: unsupported option '-fopenmp'。在 Linux 和 Windows 上的 gccMSVC 分别与 CMake OpenMP 配置相容,但 Mac OS X 不行。

1
你使用哪个文档来描述 OpenMP_EXE_LINKER_FLAGS 变量?在 CMake 网站上, FindOpenMP.cmake 模块的 文档 描述了 OpenMP_<lang>_LIBRARIES 变量是链接库的列表:target_link_libraries(OpenMPTest ${OpenMP_C_LIBRARIES}) - Tsyvarev
我将此答案用作参考:https://dev59.com/P2ct5IYBdhLWcg3wCZIT#12404666 - BullyWiiPlaza
1个回答

6

正如Tsyvarev所评论的那样,解决方案是使用更新的方式CMake中包含OpenMP

cmake_minimum_required(VERSION 3.14)
project(OpenMPTest)

set(CMAKE_CXX_STANDARD 17)

add_executable(OpenMPTest main.cpp)

find_package(OpenMP REQUIRED) # Find the package
target_link_libraries(${PROJECT_NAME} ${OpenMP_CXX_LIBRARIES}) # Link against it for C++

这个程序可以在 WindowsUbuntuMac OS X 上使用它们各自平台的默认编译器编译。

虽然得票最高,但不推荐采用这里的回答


应该使用导入的目标,像这样:target_link_libraries(OpenMPTest PRIVATE OpenMP::OpenMP_CXX) - Alex Reinking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接