Linker errors when using boost serialization

后端 未结 2 1076
[愿得一人]
[愿得一人] 2021-01-01 21:55

I am using boost serialization. I compiled with: -L/opt/local/lib -lboost_serialization -stdlib=libc++, but got several (ungooglable) errors:

Undefin         


        
相关标签:
2条回答
  • 2021-01-01 22:39

    I could reproduce the problem using the following code:

    #include "boost/archive/text_oarchive.hpp"
    #include "boost/serialization/vector.hpp"
    #include <vector>
    #include <string>
    
    int main()
    {
        std::vector<std::string> tasks;
        boost::archive::text_oarchive oa(std::cout);
        oa << tasks;
    }
    

    This compiles and links without problems when using g++ or clang++ with their respective default flags and linking with -lboost_serialization. However, when using clang++ with libc++ linking fails with essentially the error messages quote (I have Boost installed at /opt/boost):

    clang++ -c -stdlib=libc++ -I/opt/boost -W -Wall -ansi serialize.cpp
    clang++ -o serialize.tsk -L/opt/boost/stage/lib -stdlib=libc++ serialize.o -lboost_serialization
    

    Based on this I assumed that a build with -stdlib=libc++ wants to have its own Boost build and build one using based on the Boost installation guide:

    tar jxvf ~/Downloads/boost_1_48_0.tar.bz2
    cd boost_1_48_0/tools/build/v2
    
    # change the build rules to use -stdlib=libc++:
    mv tools/clang-darwin.jam tools/clang-darwin.jam.orig
    sed -e 's/CONFIG_COMMAND)"/CONFIG_COMMAND)" -stdlib=libc++/' < tools/clang-darwin.jam.orig > tools/clang-darwin.jam
    
    ./boostrap.sh
    sudo ./b2 install --prefix=/opt/boost-clang
    cd ../../..
    /opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang stage
    sudo /opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang install --prefix=/opt/boost-clang
    

    The edits I made to clang-darwin.jam are almost certainly not those intended but they seem to do the trick: I don't know much about "bjam" and I just tried to find an appropriate location to apply the change. Some step of the installation use sudo to install things into protected directories. Obviously, you can install into some other directory where you have write permissions as well. I just installed things on my machine in a way preventing me from accidentally messing it up.

    However, with this installation in place I could successfully build the program:

    /opt/llvm/bin/clang++ -stdlib=libc++ -W -Wall -ansi -I/opt/boost-clang  -c -o serialize.o serialize.cpp
    /opt/llvm/bin/clang++ -stdlib=libc++ -L/opt/boost-clang/lib serialize.o -lboost_serialization -o serialize.tsk
    
    0 讨论(0)
  • 2021-01-01 22:40

    It looks like your boost libraries may be 32 bit.

    That's a problem you wouldn't notice until you tried to use one of the few boost utils that are not header-only.

    0 讨论(0)
提交回复
热议问题