簡體   English   中英

啟用 OpenMP 的簡單代碼無法編譯:“clang: 錯誤:鏈接器命令失敗,退出代碼為 1”

[英]Simple OpenMP-enabled code does not compile: "clang: error: linker command failed with exit code 1"

我嘗試使用 Xcode 附帶的 Apple Clang 編譯器在 MacOS 上測試 OpenMP。

代碼:

#include <iostream>
#include <cmath>
#include </usr/local/opt/libomp/include/omp.h>

int main() {
    std::cout << "Hello, World!" << std::endl;
    #pragma omp parallel
    {
        printf("Hello World! \n");
    }
    return 0;
}

這是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.19)
project(untitled)

set(CMAKE_CXX_STANDARD 14)
include (FindOpenMP)
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}")
    message (VERBOSE "OpenML library found")
else()
    message (FATAL_ERROR "OpenML library not found (required for multithreading)")
endif ()
add_executable(untitled main.cpp)

這是編譯器的錯誤:

Scanning dependencies of target untitled
[ 50%] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
[100%] Linking CXX executable untitled
Undefined symbols for architecture x86_64:
  "___kmpc_fork_call", 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[3]: *** [untitled] Error 1
make[2]: *** [CMakeFiles/untitled.dir/all] Error 2
make[1]: *** [CMakeFiles/untitled.dir/rule] Error 2
make: *** [untitled] Error 2

OpenMP 是使用 hombrew libomp安裝的 我也嘗試添加環境變量LDFLAGS=-L/usr/local/opt/libomp/lib/並且它不影響結果


更新:使用 VERBOSE=1 編譯:

...
[100%] Linking CXX executable untitled
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_link_script CMakeFiles/untitled.dir/link.txt --verbose=1
/Library/Developer/CommandLineTools/usr/bin/c++  -Xclang -fopenmp -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names -L/usr/local/opt/libomp/lib/  CMakeFiles/untitled.dir/main.cpp.o -o untitled 
Undefined symbols for architecture x86_64:
  "___kmpc_fork_call", 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[3]: *** [untitled] Error 1
make[2]: *** [CMakeFiles/untitled.dir/all] Error 2
make[1]: *** [CMakeFiles/untitled.dir/rule] Error 2
make: *** [untitled] Error 2

通過使用set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")並在其他地方使用set ,您正在替換 CMAKE 放置的標志。 在這種情況下最好追加而不是替換。 您可以在此處使用add_compile_options(-Wall)

正如@Tsyvarev 所提到的,使用導入的庫可能更好。 以下是您可以使用target_link_libraries其他一些方法。

對於您的特定情況,最好更換

find_package(OpenMP REQUIRED)

您當前所在的位置include (FindOpenMP) 此外,還要刪除 if 條件。 最后,將以下內容添加到 CMakeLists.txt 文件的末尾。

target_link_libraries(
  untitled
  PRIVATE
  OpenMP::OpenMP_CXX
)

這里很好地解釋了 PRIVATE 和 PUBLIC 之間的區別。

您最終的 CMakeLists.txt 文件應如下所示:

cmake_minimum_required(VERSION 3.19)
project(untitled)

set(CMAKE_CXX_STANDARD 14)
find_package(OpenMP REQUIRED)

add_executable(
  untitled 
  main.cpp
)

target_link_libraries(
  untitled
  PRIVATE
  OpenMP::OpenMP_CXX
)

感謝 Tsyvarev 幾個月前幫助我使用 CMake。 此外,感謝 Tsyvarev 指出的答案,我的答案基於這些答案(以及我自己的測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM