【问题标题】:Linker error when compiling with Boost.Filesystem on macOS High Sierra在 macOS High Sierra 上使用 Boost.Filesystem 编译时出现链接器错误
【发布时间】:2018-04-07 02:06:20
【问题描述】:

我目前正在尝试在 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 版本是什么?要求 CMake 也有点老了,cf。 stackoverflow.com/a/42124857/2799037
  • 使用 Boost 1.66.0,我只是根据您发送的链接将 CMakeList.txt 更改为需要 cmake 3.11,这也是我安装的 cmake 版本。不幸的是,这也没有改变任何东西。

标签: c++ gcc cmake macos-high-sierra boost-filesystem


【解决方案1】:

所以我发现了发生了什么。 This 让我意识到瓶装的自制 Boost 1.66.0 库可能不是用 GCC 构建的。我将编译器切换到clang,现在它编译得很好。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多