【发布时间】:2023-03-29 19:58:01
【问题描述】:
我目前正在开发一个基于 Mac 的爱好项目,该项目涉及一些并行化,我想为此使用 OpenMP,因为在我的情况下,这似乎非常便携且相对容易实现。经过一些在线阅读,我发现 gcc 和 clang 在当前版本中都可以使用 -fopenmp 进行编译。不过,Xcode 中包含的默认 macOS 编译器已去除此功能。所以,我在我的 macOS 上同时安装了 gcc 7 和 clang 5。由于我的项目是通过 CMake 构建的,因此我编写了以下 makefile。
cmake_minimum_required(VERSION 3.0)
project(Project C CXX)
#SET(CMAKE_C_COMPILER /usr/local/bin/gcc-7)
#SET(CMAKE_CXX_COMPILER /usr/local/bin/gcc-7)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -mavx2 -march=haswell -flto=thin -g0")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE(Boost 1.65 COMPONENTS filesystem system thread atomic chrono regex)
FIND_PACKAGE(OpenCV REQUIRED core imgproc imgcodecs calib3d)
set(HDF5_USE_STATIC_LIBRARIES ON)
set(HDF5_ROOT /usr/local/HDF_GROUP/HDF5/1.10.0/)
FIND_PACKAGE(HDF5 REQUIRED)
include_directories(${CMAKE_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${HDF5_INCLUDE_DIRS})
add_executable(Project /path/to/many/files..)
TARGET_LINK_LIBRARIES(Project ${Boost_LIBRARIES})
TARGET_LINK_LIBRARIES(Project ${OpenCV_LIBS})
TARGET_LINK_LIBRARIES(Project ${HDF5_LIBRARIES})
在禁用 CMAKE_CXX_COMPILER 设置的这个版本中,代码可以顺利编译、链接和运行。一旦我将 CMake 设置为对完全相同的项目使用 gcc 或 vanilla-clang 而没有任何进一步的更改,编译就可以顺利完成,但链接失败。链接器报告了数百个丢失的符号,从几个 OpenCV 符号到大多数 libc++ 符号,如
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
_main in main.cpp.o
因此,我显然遗漏了一些基本的东西。使用 vanilla-clang,我尝试添加 -L/usr/local/opt/llvm/lib 以将链接器指向 clang 附带的库。不幸的是,这并没有改变。
我会很感激有关此事的任何提示。谢谢
【问题讨论】:
标签: c++ macos gcc linker clang