簡體   English   中英

鏈接靜態庫時未定義的參考

[英]Undefined reference when linking static libraries

我有幾個使用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) 

如果我從庫中提取對象並將其全部放入庫中,那么一切都會順利進行。

我想將它們分開,有沒有辦法做到這一點?

您可以嘗試通過對庫進行分組來使鏈接器進行遞歸鏈接。 我沒有檢查以下內容,但可能會更改:

LIBS=library1.a library2.a

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

這將導致鏈接器來回移動,直到定義了所有符號為止,這會增加鏈接器的性能成本。 當兩個庫相互依賴時,這很有用,因為鏈接程序通常只將每個文件傳遞一次。

希望這可以幫助

因為您說library1取決於來自library2的引用,所以您的LIBS = library1.a library2.a需要更改為LIBS = library2.a library1.a

在編譯過程中,符號是從列出的庫的左到右順序進行解析的,因此,如果您依賴library1.a中的library2.a,則需要首先提供library2.a。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM