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)

我正在运行 Ubuntu 12.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

这将导致链接器来回运行,直到定义所有符号,以链接器性能为代价。当两个库相互依赖时,这很有用,因为链接器通常只传递每个文件一次。

希望这可以帮助

于 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 回答