[英]How to use and link boost on macOS using CMake?
感謝所有提供幫助的人:最終奏效的是:
set(CMAKE_CXX_COMPILER "gcc-10")
set(CMAKE_C_COMPILER "g++-10")
至:
set(CMAKE_CXX_COMPILER "/usr/local/opt/llvm/bin/clang")
set(CMAKE_C_COMPILER "/usr/local/opt/llvm/bin/clang++")
嘗試將 boost 鏈接到我的程序時出現以下錯誤:
[ 83%] Linking CXX executable cartogram
Undefined symbols for architecture x86_64:
"__ZN5boost15program_options11to_internalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", referenced from:
__ZN5boost15program_options11to_internalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt6vectorIS7_SaIS7_EERKS8_IT_SaISB_EE in main.cpp.o
"__ZN5boost15program_options16validation_error12get_templateB5cxx11ENS1_6kind_tE", referenced from:
__ZN5boost15program_options10validators17get_single_stringIcEERKNSt7__cxx1112basic_stringIT_St11char_traitsIS5_ESaIS5_EEERKSt6vectorIS9_SaIS9_EEb in main.cpp.o
"__ZN5boost15program_options19options_descriptionC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjj", referenced from:
_main in main.cpp.o
"__ZN5boost15program_options20invalid_option_valueC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", referenced from:
__ZN5boost15program_options8validateIicEEvRNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIT0_St11char_traitsIS7_ESaIS7_EEESaISB_EEPT_l in main.cpp.o
"__ZN5boost15program_options22error_with_option_nameC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_i", referenced from:
__ZN5boost15program_options10validators17get_single_stringIcEERKNSt7__cxx1112basic_stringIT_St11char_traitsIS5_ESaIS5_EEERKSt6vectorIS9_SaIS9_EEb in main.cpp.o
"__ZN5boost15program_options3argB5cxx11E", referenced from:
__ZNK5boost15program_options11typed_valueIbcE4nameB5cxx11Ev in main.cpp.o
__ZNK5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE4nameEv in main.cpp.o
__ZNK5boost15program_options11typed_valueIicE4nameB5cxx11Ev in main.cpp.o
"__ZN5boost15program_options6detail7cmdline21set_additional_parserENS_9function1ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_ERKSA_EE", referenced from:
__ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_ERKSA_EE in main.cpp.o
"__ZN5boost15program_options6detail7cmdlineC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EE", referenced from:
__ZN5boost15program_options25basic_command_line_parserIcEC1EiPKPKc in main.cpp.o
"__ZN5boost15program_options8validateERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EEPS9_i", referenced from:
__ZNK5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE6xparseERNS_3anyERKSt6vectorIS7_SaIS7_EE in main.cpp.o
"__ZN5boost15program_options8validateERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EEPbi", referenced from:
__ZNK5boost15program_options11typed_valueIbcE6xparseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EE in main.cpp.o
"__ZN5boost15program_optionslsERSoRKNS0_19options_descriptionE", referenced from:
_main in main.cpp.o
"__ZNK5boost15program_options22abstract_variables_mapixERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", referenced from:
_main in main.cpp.o
__Z8read_csvN5boost15program_options13variables_mapEP8MapState in read_csv.cpp.o
"__ZNK5boost15program_options22error_with_option_name23substitute_placeholdersERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", referenced from:
__ZTVN5boost10wrapexceptINS_15program_options20invalid_option_valueEEE in main.cpp.o
__ZTVN5boost10wrapexceptINS_15program_options16validation_errorEEE in main.cpp.o
__ZTVN5boost15program_options16validation_errorE in main.cpp.o
__ZTVN5boost15program_options20invalid_option_valueE in main.cpp.o
"__ZNK5boost15program_options29value_semantic_codecvt_helperIcE5parseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEb", referenced from:
__ZTVN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcEE in main.cpp.o
__ZTVN5boost15program_options11typed_valueIicEE in main.cpp.o
__ZTVN5boost15program_options11typed_valueIbcEE in main.cpp.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
但是,當運行 cmake 命令時,cmake 通知我它已找到 boost 和所需的組件:
-- Found Boost: /usr/local/lib/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.40") found components: program_options
我正在使用gcc
和g++
版本10.2.0
。 我使用cmake -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_C_COMPILER=gcc-10
配置我的 CMake 文件。
我已經嘗試了以下 2 個鏈接選項,但是,它們都導致相同的錯誤:
target_link_libraries(cartogram CGAL::CGAL Boost::program_options ${FFTW_LIBRARIES})
和target_link_libraries(cartogram CGAL::CGAL ${Boost_LIBRARIES} ${FFTW_LIBRARIES})
在我調用 find boost(使用: find_package(Boost 1.40 COMPONENTS program_options REQUIRED)
)之前,我還嘗試包括add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)
(編輯:來自Boost Linking questions )。
附帶說明一下,完全相同的 cmake 文件可以在 Linux 上的 Ubuntu 上完美找到!
我該如何解決這個錯誤?
編輯:我什至不完全確定這是否是一個鏈接錯誤,因為當我根本不包含要鏈接的 boost 庫時(因為我相信程序選項可以用作 header 唯一庫),我仍然得到同樣的錯誤!
編輯 2:這是我的 CMake 代碼的全部內容:
# code for findFFTW
configure_file(downloadFindFFTW.cmake.in findFFTW-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findFFTW-download )
if(result)
message(FATAL_ERROR "CMake step for findFFTW failed: ${result}")
else()
message("CMake step for findFFTW completed (${result}).")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findFFTW-download )
if(result)
message(FATAL_ERROR "Build step for findFFTW failed: ${result}")
endif()
set(findFFTW_DIR ${CMAKE_CURRENT_BINARY_DIR}/findFFTW-src)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${findFFTW_DIR}")
# As per https://github.com/CGAL/cgal/wiki/How-to-use-CGAL-with-CMake-or-your-own-build-system
cmake_minimum_required(VERSION 3.1)
project(cartogram)
# set(PLATFORM_SPECIFIC_LIBS "-lpthread")
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)
set(CMAKE_CXX_STANDARD 20)
set(THREADS_PREFER_PTHREAD_FLAG ON)
set(CMAKE_BUILD_TYPE Release)
find_package(CGAL)
find_package(Boost 1.40 COMPONENTS program_options REQUIRED)
find_package(FFTW)
find_package(Threads REQUIRED)
add_executable(cartogram main.cpp
geo_div.cpp
map_state.cpp
read_csv.cpp
rescale_map.cpp
write_eps.cpp
read_geojson.cpp
fill_with_density.cpp
blur_density.cpp
flatten_density.cpp
ft_real_2d.cpp)
# Boost::program_options ${Boost_LIBRARIES}
target_link_libraries(cartogram
CGAL::CGAL
${Boost_LIBRARIES}
${FFTW_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT})
編輯3:這是我運行cmake -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_C_COMPILER=gcc-10
時得到的:
CMake Warning:
No source or binary directory provided. Both will be assumed to be the
same as the current working directory, but note that this warning will
become a fatal error in future CMake releases.
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
Compatibility with CMake < 2.8.12 will be removed from a future version of
CMake.
Update the VERSION argument <min> value or use a ...<max> suffix to tell
CMake that the project does not need compatibility with older versions.
CMake Warning at /usr/local/Cellar/cmake/3.19.2/share/cmake/Modules/Platform/Darwin-Initialize.cmake:303 (message):
Ignoring CMAKE_OSX_SYSROOT value:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
because the directory does not exist.
Call Stack (most recent call first):
/usr/local/Cellar/cmake/3.19.2/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake:21 (include)
CMakeLists.txt:3 (project)
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/adityasinghania/Desktop/gastner/cartogram_cpp-master/cartogram_generator/findFFTW-download
CMake step for findFFTW completed (0).
[ 11%] Performing update step for 'findFFTW_download'
[ 22%] No patch step for 'findFFTW_download'
[ 33%] No configure step for 'findFFTW_download'
[ 44%] No build step for 'findFFTW_download'
[ 55%] No install step for 'findFFTW_download'
[ 66%] No test step for 'findFFTW_download'
[ 77%] Completed 'findFFTW_download'
[100%] Built target findFFTW_download
-- The C compiler identification is GNU 10.2.0
-- The CXX compiler identification is GNU 10.2.0
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/local/bin/gcc-10 - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Checking whether CXX compiler has -isysroot
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/local/bin/g++-10 - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using header-only CGAL
-- Targetting Unix Makefiles
-- Using /usr/local/bin/g++-10 compiler.
-- DARWIN_VERSION=19
-- Mac Leopard detected
-- Found GMP: /usr/local/lib/libgmp.dylib
-- Found MPFR: /usr/local/lib/libmpfr.dylib
-- Found Boost: /usr/local/lib/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.48")
-- Boost include dirs: /usr/local/include
-- Boost libraries:
-- Using gcc version 4 or later. Adding -frounding-math
-- Found Boost: /usr/local/lib/cmake/Boost-1.74.0/BoostConfig.cmake (found suitable version "1.74.0", minimum required is "1.40") found components: program_options
-- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
-- Found FFTW: /usr/local/include
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/adityasinghania/Desktop/gastner/cartogram_cpp-master/cartogram_generator
您收到這些鏈接錯誤的原因可能是您嘗試鏈接AppleClang
使用g++
編譯的 Boost 庫。 Clang 和 g++ 的標准庫實現是 ABI 不兼容的,即您不能使用g++
鏈接到 Clang 編譯的庫。
如果您想在 MacOS 上使用g++
,請確保您使用的庫也使用g++
編譯。 這可能有用: https://andschwa.com/post/boost-with-gcc-on-os-x/
我最喜歡的方法是使用vcpkg
。
vcpkg
vcpkg
文件夾。./vcpkg/vcpkg install boost
。 此命令完成后,運行./vcpkg/vcpkg install integrate
; 有了這個,一個關於如何整合你的 cmake 文件的命令將出現。 將其復制並粘貼到文本編輯器中以供將來參考-DCMAKE_TOOLCHAIN_FILE=$vcpkgRoot/scripts/buildsystems/vcpkg.cmake
的 CMake 文件(由前面的命令給出)。或者,如果您使用 Visual Studio 代碼,則運行vcpkg integrate install
將自動連接庫到 Visual工作室代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.