Ad *_*d N 2 c++ linker cmake boost-serialization xcode5
在我们的主项目中,构建管理推迟到CMake.对于我们不同的依赖项,一切都很顺利,包括Boost :: System,但是我们无法为Boost :: Serialization编译这个最小的例子.
# 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)
#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)
我们的版本:
编辑:
实际上找到了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构建(而不是系统).
恕我直言,没有必要清除BOOST_ROOT变量:
set(BOOST_ROOT CACHE PATH "Path to Boost library")
Run Code Online (Sandbox Code Playgroud)
如果已经找到了boost(由其他父项目),你将找到两次工作,如果项目使用自定义提升位置,你将重写它.