簡體   English   中英

Boost序列化:從CMake生成的XCode 5項目中的鏈接器錯誤(帶有最少的完整示例)

[英]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
  • CMake的2.8-12
  • 提升1.55
  • OSX 10.8

編輯:

實際上找到了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。 我正在使用帶有靜態庫的自定義增強構建(不是系統)。

PS

恕我直言,無需清除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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM