6

今夜はバカみたいな気分だと言うことから始めましょう。RHEL5.6、gcc 4.1.2、boost 1.44.0、BoostSerializationで発生した作業の問題を​​最小限に再現しようとしています。

私がこの問題を抱えている環境は、Ubuntu Server(devパッケージがインストールされている)、gcc 4.7.2、およびboost 1.44.0のビルド(システムコンパイラ、パッケージなどに対して)です。

私のコードはきれいにコンパイルされますが、さまざまなboost::archiveタイプに関連する無数の未定義のシンボルを取得しています。私のmakeでstraceを実行すると、期待されるboost_serializationライブラリを取得していることがわかります。

668 43569 stat("/usr/local/boost/1.44.0/lib/libboost_serialization.so", {st_mode=S_IFREG|0755, st_size=700481, ...}) = 0
669 43569 open("/usr/local/boost/1.44.0/lib/libboost_serialization.so", O_RDONLY) = 8

私のmakefileは:

default: test-app
all: test-app

BOOST := /usr/local/boost/1.44.0

CPPFLAGS := -fPIC -Wall -Wextra -Werror
INCDIRS := -isystem$(BOOST)/include
.LIBDIRS. := $(BOOST)/lib
.LIBS. :=boost_serialization
LIBS := $(foreach lib,$(.LIBS.),-l$(lib))
LIBDIRS := $(foreach dir,$(.LIBDIRS.),-L$(dir))
CPPFLAGS += $(INCDIRS)

base.o : base.cpp base.hpp
        g++ $(CPPFLAGS) --compile $< -o $@ -g

derived.o : derived.cpp base.hpp derived.hpp
        g++ $(CPPFLAGS) --compile $< -o $@ -g

main.o: main.cpp derived.hpp
        g++ $(CPPFLAGS) --compile $< -o $@ -g

test-app: main.o derived.o base.o
        g++ -o $@ $(LIBDIRS) $(LIBS) $^

clean:
        rm -f *.o test

私が得ているリンカーエラーの(非常に)小さなサンプルは次のようなものです:

base.o:関数void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception :: archive_exception(boost :: archive :: archive_exception :: exception_code、char const *、char const *)' /usr/local/boost/1.44.0/include/ boost / archive / basic_text_oprimitive.hpp:91: boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception ::〜archive_exception()'base.oへの未定義の参照:関数void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception :: archive_exception(boost :: archive :: archive_exception :: exception_code、char const *、char const *)'/usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception ::〜への未定義の参照archive_exception()'base.o:関数内void boost::archive::basic_text_oprimitive<std::ostream>::save<unsigned int>(unsigned int const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception :: archive_exception(boost :: archive :: archive_exception :: exception_code、char const *、char const *)'/usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive。 hpp:91: boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception ::〜archive_exception()への未定義の参照 '

同様に、参照されている.soでシンボルダンプを実行すると、必要なシンボルが表示されます。

objdump -t /usr/local/boost/1.44.0/lib/libboost_serialization.so | c ++ filt | grep "boost :: archive :: archive_exception ::〜archive_exception()" 000000000004e670 g F .text 0000000000000065
boost :: archive :: archive_exception ::〜archive_exception()000000000004e6e0 g F.text0000000000000009仮想サンクtoboost:: archive :: archive_exception ::〜archive_exception()000000000004e6f0 g F .text 0000000000000012
boost :: archive :: archive_exception ::〜archive_exception()000000000004ed60 g F .text 000000000000005c
boost :: archive :: archive_exception ::〜archive_exception()000000000004e710 g F .text 0000000000000009ブーストする仮想サンク::archive:: archive_exception ::〜archive_exception()

私はしばらくの間テーブルに頭をぶつけてきました...誰かが助けてくれることを願っています。具体的な出典は重要ではないと思いますが、ご要望があれば投稿できます。

追加の環境の詳細:

g ++ --version g ++(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2 Copyright(C)2012 Free Software Foundation、Inc.これはフリーソフトウェアです。コピー条件については、ソースを参照してください。保証はありません。商品性や特定の目的への適合性についてもそうではありません。

ld --version
GNU ld (GNU Binutils for Ubuntu) 2.22.90.20120924
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

さらに、これはWindows 8のHyper-Vで実行されているVM上にありますが、ここでは重要ではないと思います。

完全なリンク行: g ++ -L / usr / local / boost / 1.44.0 / lib -lboost_serialization -o test-appmain.o派生.obase.o

4

2 に答える 2

8

-lboost_serialization のように最後に置くことで、同じ問題が発生しました

g++ -L/usr/local/boost/1.44.0/lib -o テストアプリ main.o 派生.o base.o -lboost_serialization

それを解決する必要があります

于 2013-05-29T11:47:51.960 に答える
-1

バイナリ オブジェクト .o はライブラリにリンクされていません。
最初に/usr/local/boost/1.44.0/libにファイルの lib boost_serialization があることを確認します。
次に、その lib が登録されます:
sudo ldconfig -v | そうでない場合は、 grep boost_serialization を/etc/ld.so.conf.dにユーザー rootで
ファイルboost1.44.0.confを作成します。この ligne usr/local/boost/1.44.0/lib で、このコマンド sudo ldconfig -v |を開始します。grep boost_serialization


于 2013-02-27T05:56:43.260 に答える