提升序列化:从CMake生成的XCode 5项目中的链接器错误(带最小完整示例)

Ad *_*d N 2 c++ linker cmake boost-serialization xcode5

在我们的主项目中,构建管理推迟到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})
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

更多信息

我们的版本:

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

编辑:

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

提升已建成第一次使用默认参数,并按照指令的第二次这个职位.这两个版本的错误是相同的.(实际上,我认为两个构建都没有问题,因为在非CMake项目中使用库,通过将它们添加到同一帖子中描述的XCode,确实有效.)

问题

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

体系结构x86_64的未定义符号:
"boost :: archive :: 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&, main.o中的unsigned int)
"boost :: archive :: basic_text_oprimitive :: ~basic_text_oprimitive()",引用自:boost :: archive :: text_oarchive_impl ::〜text_oarchive_impl()in main.o ld:symbol(s)not not找到了架构x86_64

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

小智 5

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

find_package(Boost 1.55 REQUIRED system serialization)
Run Code Online (Sandbox Code Playgroud)

对我来说很好.Xcode 5.0.2,Boost 1.55,CMake 2.8.12.1,OS X 10.9.我正在使用静态库的自定义boost构建(而不是系统).

PS

恕我直言,没有必要清除BOOST_ROOT变量:

set(BOOST_ROOT CACHE PATH "Path to Boost library")
Run Code Online (Sandbox Code Playgroud)

如果已经找到了boost(由其他父项目),你将找到两次工作,如果项目使用自定义提升位置,你将重写它.