c++ - 从 CMake 生成的 Boost 序列化 : Linker errors in XCode 5 project,(带最小完整示例)

标签 c++ linker cmake xcode5 boost-serialization

在我们的主项目中,构建管理被推迟到 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
  • 操作系统 10.8

编辑:

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

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

问题

我们遇到了几个( undefined symbol )链接器错误:

Undefined symbols for architecture x86_64:
"boost::archive::text_oarchive_impl::save(std::string const&)", referenced from: void boost::archive::save_access::save_primitive(boost::archive::text_oarchive&, std::string const&) in main.o
"boost::archive::text_oarchive_impl::text_oarchive_impl(std::ostream&, unsigned int)", referenced from: boost::archive::text_oarchive::text_oarchive(std::ostream&, unsigned int) in main.o
"boost::archive::basic_text_oprimitive::~basic_text_oprimitive()", referenced from: boost::archive::text_oarchive_impl::~text_oarchive_impl() in main.o ld: symbol(s) not found for architecture x86_64

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

最佳答案

您需要检查所有的库是否确实由 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。我正在使用带有静态库的自定义增强构建(不是系统)。

附言

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

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

如果已经找到 boost(由其他父项目),您将执行两次查找工作,如果项目使用自定义 boost 位置,您将重写它。

关于c++ - 从 CMake 生成的 Boost 序列化 : Linker errors in XCode 5 project,(带最小完整示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362154/

相关文章:

c++ - 确定两个路径是否引用 Windows 中同一文件的最佳方法?

linux - 有没有办法在不更改 makefile 的情况下将 '-lpthread' 添加到默认链接器标志

c++ - ld : library not found for -lpthread

ubuntu - 尝试在 Ubuntu 上构建 OpenCV 3 世界模块时出现 CMake 不存在目标错误

c++ - CMake - 自动解析预编译头的依赖关系?

c++ - MSVC 友元函数声明错误

c++ - avformat_open_input 导致 RTP 流打开异常

c++ - 检查数组元素是否为空

c++ - 通过 SConstruct 链接以 boost

c - 使用cmake编译时出错: cannot find -ldwmapi