链接静态库时未定义的引用

时间:2012-08-14 05:59:11

标签: c++ gcc linker ld avr-gcc

我有几个使用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) 

如果我从库中提取对象并将所有对象放入库中,一切顺利。

我想将它们分开,是否有办法实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以尝试通过对库进行分组来使链接器执行递归链接。我没有检查以下内容但可能会改变:

LIBS=library1.a library2.a

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

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

希望这有帮助

答案 1 :(得分:0)

因为你说library1依赖于library2的引用,你的 LIBS = library1.a library2.a需要更改为LIBS = library2.a library1.a

在编译期间,符号将从列出的库的左到右顺序进行解析,因此如果您依赖于library1.a中的library2.a,则需要首先提供library2.a。