我希望使用OpenMP的外部构建版本(而不是编译器自带的版本)。
对于外部构建,am克隆https://github.com/llvm-mirror/openmp.git,然后使用以下选项进行cmake:
cmake \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_CXX_FLAGS="-std=c++17" \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_C_COMPILER=clang \
-S ${OMP_DIR} -B ${OMP_DIR}/cmake-build/Debug
在那之后我又是一个一个的。
对于我的应用程序构建和应用程序到OpenMP的链接,我使用以下CMakeLists.txt
:
cmake_minimum_required(VERSION 3.18)
project(foo C CXX)
find_package(OpenMP)
add_executable(hello_world hello.cpp)
target_link_libraries(hello_world <path_to_external_openmp>/cmake-install/Debug/lib/libomp.so)
源文件只是一个虚拟文件:
# pragma omp parallel
{
std::cout << "Hello World, from thread: " << omp_get_thread_num()
<< std::endl;
}
最后,当我执行OMP_NUM_THREADS=4 ./hello_world
时,我得到了以下结果,这显然不是预期的结果:
Hello World,来自线程:0
另外,请注意ldd ./hello_world
给出:
linux-vdso.so.1 (0x00007fffd311b000)
libomp.so => <path_to_external_openmp>/cmake-install/Debug/lib/libomp.so (0x00007fcbcbca0000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fcbcba70000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcbcb840000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcbcbde4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcbcb750000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fcbcb730000)
你知道这种意外行为的原因是什么吗?
1条答案
按热度按时间bxgwgixi1#
您需要
-fopenmp
标志;将set(CMAKE_CXX_FLAGS "-fopenmp")
添加到CMakeLists.txt文件或将-DCMAKE_CXX_FLAGS="-fopenmp"
添加到cmake命令。顺便说一句,您还可以删除
find_package(OpenMP)
,因为您使用绝对路径显式链接库。