Boost序列化:XCode 5项目中的链接器错误,由CMake生成(带最小完整示例)
Boost Serialization : Linker errors in XCode 5 project, generated from CMake (w/ minimal complete example)
在我们的主项目中,构建管理被推迟到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
- C拍摄2.8-12
- 增压1.55
- OSX 10.8
编辑:
CMake中列出的两个Boost库实际上已经找到(它们也在CMake输出中列出)。
Boost第一次使用默认参数构建,第二次按照本文中的说明构建。两个版本的错误相同。(事实上,我认为这两种构建都是可以的,因为在非CMake项目中使用库,如同一篇文章中所述,将它们添加到XCode中,确实有效。)
问题
我们得到了几个(未定义的符号)链接器错误:
体系结构x86_64的未定义符号:
"boost::archive::text_oarchive_impl::save(std::stringconst&)",引用自:中的void boost::archive::save_access::save_primitive(boost::归档::text_oarchive&,std::字符串常量&)main.o
"boost::archive::text_oarchive_impl::text_orchive_impl(std::ostream&,unsigned int)",引用自:boost::archive::text_oarchive::text_o归档(std::ostream&,unsigned int)在main.o
中"boost::archive::basic_text_oprimity::~basic_text_oprimitive()",引用自:boost::archive::text_oarchive_impl::~ text_oarchive _impl()在main.old中:找不到体系结构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构建(而不是系统)。
PS
IMHO无需清除BOOST_ROOT
变量:
set(BOOST_ROOT CACHE PATH "Path to Boost library")
如果boost已经找到(由其他父项目),您将找到两次工作,如果项目使用自定义boost位置,您将重写它。
值得一提的是,在将序列化中的内容添加回我的一个目标后,我也遇到了类似的问题,只是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 ./
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- 生成MRPT库时cmake配置失败
- 使用 cmake 生成 compile_commands.json
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- 不使用configure_file时如何使用CMake生成C++代码?
- 柯南,CMake.test()生成XML报告
- 如何在CMake中自动链接本地生成的库或导入的库
- google-cloud-cpp CMake 生成失败
- CMake 在为 UWP 生成时无法获取 VCTargetsPath 的值
- 如何使用 CMake 生成链接到静态库的 DLL
- 如何在 CMake 超级生成中查找 dll/so 文件
- CMake:防止在子目录库项目中生成测试可执行目标
- 错误:必须设置CMake工具才能生成.在工具包选项中配置CMake工具
- CMake Dlibdotnet.native生成错误
- CMake 生成的程序无法在 Windows 上链接:尝试链接到不存在的文件
- 成功的生成文件失败,在 CLion 中出现"identical" CMake
- cmake:构建依赖于非源文件.Qt帮助生成
- 生成 CMake 项目时无法打开提升库
- 如何在更改资源文件后在CLion中生成CMake
- 从MSVC项目生成CMAKE