【问题标题】:Boost Serialization : Linker errors in XCode 5 project, generated from CMake (w/ minimal complete example)Boost Serialization:XCode 5 项目中的链接器错误,由 CMake 生成(带最小完整示例)
【发布时间】:2013-12-20 03:49:53
【问题描述】:

在我们的主项目中,构建管理被推迟到 CMake。对于我们的不同依赖项,包括 Boost::System,一切都很好,但是我们无法让它编译这个最小的 Boost::Serialization 示例。

CMake 文件

# Untested with previous versions, yet should work
cmake_minimum_required(VERSION 2.8.11)

project(SerialCmake)

# Boost dependency
set(BOOST_ROOT CACHE PATH "Path to Boost library")
find_package(Boost 1.55 COMPONENTS serialization system)

# Create the target
add_executable(${PROJECT_NAME} main.cpp)

include_directories(${Boost_INCLUDE_DIR})

target_link_libraries(${PROJECT_NAME}
    ${Boost_LIBRARIES})

CPP 主文件

#include <fstream>
#include <boost/archive/text_oarchive.hpp>

class Serializable
{
    friend class boost::serialization::access;

public:
    Serializable(int a): a(a)
    {}

private:
    template <class Archive>
    inline void serialize (Archive &ar, const unsigned int version)
    {
        ar & a;
    }

    int a;
};

int main(int argc, char **argv)
{
    Serializable s1(1);

    // Save
    {
        std::ofstream ofs(argv[1]);
        boost::archive::text_oarchive oa(ofs);
        oa << s1;
    }
    return 0;
}

更多信息

我们的版本:

  • XCode 5.0.2
  • CMake 2.8-12
  • 提升 1.55
  • OSX 10.8

编辑:

实际上找到了 CMake 中列出的两个 Boost 库(它们在 CMake 输出中列出)。

第一次使用默认参数构建了 Boost,第二次按照 this post 中的说明构建了 Boost。两个版本的错误相同。 (实际上,我认为这两个版本都很好,因为在非 CMake 项目中使用这些库,通过将它们添加到 XCode 中,如同一篇文章中所述,确实有效。)

问题

我们收到几个(未定义的符号)链接器错误:

架构 x86_64 的未定义符号:
“升压::存档::text_oarchive_impl::save(std::string const&)”,引用自: void boost::archive::save_access::save_primitive(boost::archive::text_oarchive&, std::string const&) 在 main.o
“boost::archive::text_oarchive_impl::text_oarchive_impl(std::ostream&, unsigned int)”,引用自: boost::archive::text_oarchive::text_oarchive(std::ostream&, unsigned int) in main.o
“boost::archive::basic_text_oprimitive::~basic_text_oprimitive()”, 参考自: boost::archive::text_oarchive_impl::~text_oarchive_impl() 在 main.old 中:未找到架构 x86_64 的符号

任何方向?(如您所见,我们要求将应用程序与 Boost::Serialization 和 Boost::System 链接)。

【问题讨论】:

    标签: c++ linker cmake xcode5 boost-serialization


    【解决方案1】:

    您需要检查find_package 命令是否确实找到了所有库。最简单的方法 这样做是添加REQUIRED子选项:

    find_package(Boost 1.55 REQUIRED system serialization)
    

    对我来说很好用。 Xcode 5.0.2、Boost 1.55、CMake 2.8.12.1、OS X 10.9。我正在使用带有静态库的自定义增强构建(不是系统)。

    PS

    恕我直言,无需清除 BOOST_ROOT 变量:

    set(BOOST_ROOT CACHE PATH "Path to Boost library")
    

    如果已经找到了 boost(被其他父项目),你会做两次 find-work,如果项目使用自定义的 boost 位置,你将重写它。

    【讨论】:

    • 感谢您抽出宝贵时间对此进行调查。我忘了提到实际上找到了库(我仍然在命令中添加了 REQUIRED )。我看到的唯一区别是 OSX 版本(我们使用 10.8),但我认为不可能。我真的对此感到困惑!
    • @AdN 我很确定你已经安装了make 命令,你有没有尝试使用简单的UnixMakefiles 生成器(在 Mac 上是 cmake-default)。什么是详细输出? (set(CMAKE_VERBOSE_MAKEFILE ON))。我认为这很简单(:检查您的 boost 是否包含指向库目录位置的目录。检查您的 boost 库是否链接到相同的标准 c++ 库(stdlibc++libc++
    • 先生,非常感谢您! 这是一个标准库问题(似乎我的编译器默认是 GNU libstdc++,即使默认编译器是 Clang)。将项目切换为显式使用 libc++ 使其链接正确。通常不会在这里提及这一点,但请注意,您对我的工作周产生了重大影响:再次感谢。
    • @AdN 我很高兴它有帮助(:是的,这是一个非常烦人的问题,如果您使用自定义库位置,它会变得更加烦人。我正在尝试使用 cmake 工具链文件来解决这个问题问题。你可以找到我的github 项目。
    【解决方案2】:

    对于它的价值,我在将序列化添加回我的一个目标后遇到了类似的问题,只是 cmake 没有获取 CMakeLists.txt 中的更改,因此必须删除缓存:

    我只是将“序列化”添加到:

    FIND_PACKAGE(Boost REQUIRED COMPONENTS system filesystem date_time serialization)
    

    并出现此错误:

      The following Boost libraries could not be found:
    
          boost_serialization
    

    这样解决了:

    rm CMakeCache.txt
    cmake ./
    

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2020-05-19
      • 2015-01-02
      相关资源
      最近更新 更多