2017-12-14 37 views
0

현재 일부 Mac OS 기반 취미 프로젝트에서 일부 병렬 처리가 필요합니다. OpenMP를 사용하고 싶습니다. 내 경우에 구현하기가 비교적 쉽다. 일부 온라인 독서 후, 나는 gcc와 clang 모두 현재 버전에서 -fopenmp로 컴파일 할 수 있음을 알게되었습니다. Xcode에 포함 된 기본 macOS 컴파일러는이 기능을 사용하지 않습니다. 그래서 gcc 7과 clang 5를 macOS에 설치했습니다. 내 프로젝트가 CMake를 통해 빌드 된 이후, 나는 다음 makefile을 작성했다. CMAKE_CXX_COMPILER가 비활성화 설정이 버전에서 MacOS에서 비 기본 컴파일러 (GCC 또는 Vanilla-Clang) 높은 시에라 연결 문제

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가 gcc 또는 vanilla-clang을 사용하여 더 이상 변경하지 않고 똑같은 프로젝트를 만들 자마자 컴파일은 문제없이 완료되지만 연결은 실패합니다. 따라서

"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 

같은 몇 OpenCV의 기호에 대부분의 libC++ 것들에 이르기까지 누락 된 기호 링커 보고서 수백, 나는 분명히 근본적인 뭔가를 놓친 거지. vanilla-clang을 사용하여 clang과 함께 제공된 libs에 링커를 가리 키도록 -L/usr/local/opt/llvm/lib를 추가하려고 시도했습니다. 불행히도, 이것은 아무것도 변경되지 않았습니다.

나는이 문제에 대해 어떤 힌트를 주셔서 감사하겠습니다. 감사합니다

답변

1

gcc 컴파일러 드라이버를 사용하여 컴파일러를 'gcc'에서 'g ++'로 변경하면 g ++는 gcc가 자동으로 표준 C++ 라이브러리를 가져오고, 그렇지 않으면 -lstdC++를 추가합니다 필요하지만 g ++을 컴파일러 드라이버로 사용하는 것이 일반적으로 더 쉽습니다.

+0

힌트를 보내 주셔서 감사합니다. 이것은 누락 된 기호의 수를 확실히 줄입니다. 흥미롭게도 누락 된 기호는 여전히 "std :: __ 1 :: basic_string , std :: __ 1 :: allocator > :: ~ basic_string()"과 같은 기본 C++ 기능을 참조합니다. 그러나 항상 그것들을 참조하는 Boost 또는 OpenCV 중 하나입니다. lib와 gcc를 모두 다시 컴파일해야합니까? – GruenSein

+0

업데이트 : LLVM/clang 5.0에서 작동합니다. GCC는 여전히 이전에 애플의 맹공격에 의해 수집 된 라이브러리와 어려움을 겪고있는 것으로 보인다. 어쨌든, 이것은 많은 도움이됩니다! – GruenSein