[英]Boost Serialization : Linker errors in XCode 5 project, generated from CMake (w/ minimal complete example)
在我們的主要項目中,將構建管理推遲到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})
#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;
}
我們的版本:
編輯:
實際上找到了CMake中列出的兩個Boost庫(就這樣在CMake輸出中列出了它們)。
Boost是首次使用默認參數構建的,第二次是根據這篇文章中的指示構建的 。 兩個版本的錯誤相同。 (實際上,我認為這兩個版本都可以,因為在非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
引用自main.o中的boost :: archive :: text_oarchive :: text_oarchive(std :: ostream&,unsigned int)“ boost :: archive :: text_oarchive_impl :: text_oarchive_impl(std :: ostream&,unsigned int)”
“ boost :: archive :: basic_text_oprimitive ::〜basic_text_oprimitive()”,引用自:main.o中的boost :: archive :: text_oarchive_impl :: ~~ text_oarchive_impl()ld:架構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位置,則將其重寫。
對於它的價值,在將序列化添加回我的目標之一后,我遇到了類似的問題,只是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 ./
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.