1

コンテキストツリースイッチングを実装する次のc++コードをコンパイルしようとしています(ダウンロードページの詳細):

Zipアーカイブ、0.2 MB

いくつかのブーストライブラリが必要です。boost.orgから最新バージョンをダウンロードし、Webサイトの指示に従ってビルドする必要のあるすべてのライブラリをビルドしました。また、アーカイブに含まれているmakefileを変更して、boost libパスとboost_systemを追加しましたが、それでもエラーが発生します。これが私が使用しているmakefileです:

PROGRAM = cts
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
CFLAGS = -Wall
LDFLAGS = -lboost_program_options -lboost_filesystem -lboost_system

$(PROGRAM): $(OBJECTS) Makefile
    g++ $(CFLAGS) -L/home/users/mnembrini/opt/boost/lib $(LDFLAGS) -o $(PROGRAM) $(OBJECTS)

# Include known dependecies from -MMD
#-include $(OBJECTS:.o=.d)

%.o: %.cpp
    g++ -MMD $(CFLAGS) -I/home/users/mnembrini/opt/boost/include -c $<

clean:
    rm -f $(OBJECTS) *.d

.PHONY: clean

ここで、boostは〜/ opt / boostにあります(libを含み、subdirを含みます)。そして、ここにリンクエラーがあります:

mnembrini@meem:~/src/cts-v1 $ make
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c ac.cpp
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c cts.cpp
cts.cpp: In member function ‘virtual void SwitchingTree::update(bit_t)’:
cts.cpp:402:12: warning: variable ‘snc’ set but not used [-Wunused-but-set-variable]
cts.cpp: In member function ‘virtual double SwitchingTree::prob(bit_t)’:
cts.cpp:432:12: warning: variable ‘snc’ set but not used [-Wunused-but-set-variable]
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c ctw.cpp
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c icsilog.cpp
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c main.cpp
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c PowFast.cpp
g++ -Wall -L/home/users/mnembrini/opt/boost/lib -lboost_program_options -lboost_filesystem -lboost_system -o cts ac.o cts.o ctw.o icsilog.o main.o PowFast.o
cts.o: In function `__static_initialization_and_destruction_0(int, int)':
cts.cpp:(.text+0x1743): undefined reference to `boost::system::generic_category()'
cts.cpp:(.text+0x174f): undefined reference to `boost::system::generic_category()'
cts.cpp:(.text+0x175b): undefined reference to `boost::system::system_category()'
ctw.o: In function `__static_initialization_and_destruction_0(int, int)':
ctw.cpp:(.text+0xfcf): undefined reference to `boost::system::generic_category()'
ctw.cpp:(.text+0xfdb): undefined reference to `boost::system::generic_category()'
ctw.cpp:(.text+0xfe7): undefined reference to `boost::system::system_category()'
main.o: In function `showHelp()':
main.cpp:(.text+0x1c): undefined reference to `boost::program_options::operator<<(std::basic_ostream<char, std::char_traits<char> >&, boost::program_options::options_description const&)'
main.o: In function `initOptions(int, char**, boost::program_options::variables_map&)':
main.cpp:(.text+0x10f): undefined reference to `boost::program_options::options_description::add_options()'
main.cpp:(.text+0x129): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)'
main.cpp:(.text+0x13e): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'
main.cpp:(.text+0x153): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'
main.cpp:(.text+0x166): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'
main.cpp:(.text+0x1d6): undefined reference to `boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool)'
main.cpp:(.text+0x200): undefined reference to `boost::program_options::notify(boost::program_options::variables_map&)'
main.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x1f13): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x1f1f): undefined reference to `boost::system::generic_category()'
[snip (2-3 screens like above)]
collect2: ld returned 1 exit status
make: *** [cts] Error 1

Ubuntu12.0464ビットでGcc4.6.3を使用しています。

4

2 に答える 2

5

コマンドライン内のすべてのオブジェクトファイルの後にすべてのライブラリを配置します。他のいくつかのオペレーティングシステムとは異なり、ここでは順序が重要です。

于 2012-11-06T23:01:24.993 に答える
0

(nmが以前に書いたように)リンクの順序が正しいことを確認する必要があります。基本的に、一部の実装では、オブジェクトだけでなくライブラリもリンクする順序が重要になります。

以前のコードでまだ参照されていないライブラリをリンクすると、そのライブラリは破棄されます。同じシンボルを参照することで、プログラム内の異なる(バージョンの)ライブラリをハッキングする解決策を思いついたのを覚えていますが、最初のシンボルの後にリンクされたオブジェクトで、別のライブラリバージョンを再リンクします。

-lyourprojwantingv1 -llibraryofv1 -lyourprojwantingv2 -llibraryofv2

個人的には、これはすべてただの狂気だと思います!(それのすべて!)

于 2012-11-06T23:22:01.840 に答える