0

avr-arを使用して作成されたライブラリがいくつかあります。それぞれにいくつかのオブジェクトが含まれています。

library1のオブジェクトには、library2のオブジェクトのシンボルが必要です。問題は、すべてをコンパイルしようとすると問題が発生することですundefined reference

これは失敗しているところです。$(INCLUDE)$(CFLAGS)$(LIBS)では何も派手なことはありません。

CFLAGS=-mmcu=atmega328p -DF_CPU=16000000UL -Os -w -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
LIBS=library1.a library2.a

$(CXX) $(INCLUDE) $^ $(CFLAGS) -o $@ $(LIBS)

私はUbuntu12.04を実行していて

Using built-in specs.
COLLECT_GCC=avr-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
Target: avr
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
Thread model: single
gcc version 4.5.3 (GCC) 

ライブラリからオブジェクトを抽出し、すべてをライブラリに入れると、すべてがうまくいきます。

それらを別々に保ちたいのですが、これを達成する方法はありますか?

4

2 に答える 2

1

ライブラリをグループ化することで、リンカーに再帰リンクを実行させることができます。以下はチェックしていませんが、変更される可能性があります。

LIBS=library1.a library2.a

LIBS=-Wl,--start-group library1.a library2.a -Wl,--end-group

これにより、すべてのシンボルが定義されるまでリンカが行ったり来たりするため、リンカのパフォーマンスが低下します。これは、2 つのライブラリが相互に依存している場合に便利です。これは、リンカーが通常各ファイルを 1 回だけ渡すためです。

お役に立てれば

于 2012-08-15T10:12:27.243 に答える
0

library1 は library2 からの参照に依存していると言うので、LIBS=library1.a library2.a を LIBS=library2.a library1.a に変更する必要があります。

コンパイル中、シンボルはリストされたライブラリの左から右の順序で解析されるため、library1.a 内の library2.a に依存している場合は、library2.a を最初に指定する必要があります。

于 2012-08-14T08:59:24.487 に答える