今夜はバカみたいな気分だと言うことから始めましょう。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