在macOS High Sierra上使用Boost.Filesystem编译时的链接器错误
Linker error when compiling with Boost.Filesystem on macOS High Sierra
我目前正在尝试编译一个在macOS High Sierra 10.13.4上使用Boost.Filesystem的程序。我也使用 gcc 7.3 进行编译,我使用 Homebrew 手动安装。程序将编译,但在链接过程中抛出以下错误
Undefined symbols for architecture x86_64:
"boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)", referenced from:
boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<boost::filesystem::directory_entry>::type>, boost::filesystem::path&>::type boost::filesystem::path::operator=<boost::filesystem::directory_entry>(boost::filesystem::directory_entry const&) in world.cc.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我正在使用 cmake 进行构建,我的 CMakeLists.txt 文件如下所示
cmake_minimum_required (VERSION 3.0)
MESSAGE(STATUS "Compiler: " ${CMAKE_CXX_COMPILER})
# variables for CMAKE
set(PROJECT sealab)
set(BINARY ${PROJECT}.out)
set(SRC_DIR src/)
set(INC_DIR inc/)
FILE(GLOB_RECURSE SRC ${SRC_DIR}/*.cc)
# library include dirs
set(IMGUI_INC libs/imgui/)
set(SPDLOG_INC libs/spdlog/include/)
set(JSON_INC libs/json/include/)
set(
LIB_INC
${IMGUI_INC}
${SPDLOG_INC}
${JSON_INC}
${GLM_INC}
)
# library src files
FILE(GLOB IMGUI_SRC ${IMGUI_INC}*.cpp)
FILE(GLOB SPDLOG_SRC ${SPDLOG_INC}*.cpp)
set(
LIB_SRC
${IMGUI_SRC}
${SPDLOG_SRC}
)
project(${PROJECT})
# version number
set(${PROJECT}_VERSION_MAJOR 0)
set(${PROJECT}_VERSION_MINOR 1)
# Compilation Database
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unused-local-typedefs")
# threads
set(THREADS_PREFER_PTHREAD_FLAG ON)
# adding packages
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 3.2 REQUIRED)
find_package(Threads REQUIRED)
find_package(Assimp REQUIRED)
find_package(glm REQUIRED)
find_package(Boost COMPONENTS system filesystem REQUIRED)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME ON)
# adding directories and source files
include_directories(
${OPENGL_INCLUDE_DIRS}
${GLEW_INCLUDE_DIRS}
${ASSIMP_INCLUDE_DIRS}
${GLM_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
include_directories(${INC_DIR} ${LIB_INC})
link_directories(${INC_DIR} ${LIB_INC})
# adding source files
add_executable(${BINARY} ${SRC} ${LIB_SRC})
set_target_properties(${BINARY} PROPERTIES COTIRE_UNITY_TARGET_NAME "unity")
# linking libraries
target_link_libraries(
${BINARY}
OpenGL::GL
${GLEW_LIBRARIES}
Threads::Threads
${ASSIMP_LIBRARIES}
glfw
glm
${Boost_LIBRARIES}
)
我正在使用命令cmake -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX .
来生成 Makefile,并且环境变量 $CC
和 $CXX
设置为由 Homebrew 创建的 gcc 和 g++ 版本。
我查看了其他几个 stackoverflow 答案,其中人们有相同的错误,所有这些都是错误链接的结果。我以与正确答案相同的方式进行链接,但错误仍然存在。我是否仍然错误地链接它,或者这里还有其他事情发生?
所以我发现了发生了什么。这让我意识到,也许瓶装自制的 Boost 1.66.0 库不是使用 GCC 构建的。我将编译器切换到 clang,现在它可以很好地编译。
相关文章:
- Visual Studio 2017 ARM 交叉编译链接器崩溃
- CGAL 编译/链接器错误
- opencv 3.0 Visual Studio Community 2017 编译链接错误
- 在 Linux 中编译/链接多个 C++ 库
- 加速极慢的 MinGW-w64 编译/链接?
- Xcode - 如何使用"-fexhaustive-register-search"进行编译 - 链接器崩溃需要
- 交叉编译:链接时对std::__atomic_futex_unsigned_base::_M_futex_notify_
- 无法从单独的.cpp使用模板化成员编译/链接类
- 交叉编译链接器错误
- Eclipse C/C++:外部库的交叉编译链接器错误:Ubuntu VM amd64 to Ubuntu armhf
- 编译/链接 C 和 C++ 文件时出现问题
- C++编译链接
- 如何正确编译/链接Linux Makefile中的单元测试
- 在以下程序中获取编译链接错误
- 与Boost日志进行交叉编译链接期间未解决的符号
- 如何编译/链接Boost与clang++/libc++
- Cef项目编译链接error2001
- 我如何编译/链接测试用例(googleTest)使用cmake的代码捆绑在共享库
- 编译链接
- 编译/链接过程是如何工作的