2014-01-07 22 views
0

我有一些代碼可以用於不同的嵌入式項目,所以我決定創建一個庫。該庫建立在另一個更廣泛的靜態庫(libopencm3)上靜態庫鏈接問題(沒有引用主要或沒有引用)

我只有一個(現在)c文件編譯爲一個對象文件,然後存檔。

我不確定我是否應該使用libopencm3將庫中的對象文件鏈接起來,或者如果稍後將應用程序鏈接到應用程序時應該這樣做。我認爲是前者,但鏈接器抱怨說,main()函數沒有定義(它在libopencm3引用):

arm-none-eabi-gcc -Os -g -Wall -Wextra -Wimplicit-function-declaration -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes -Wundef -Wshadow -I/usr/src/libopencm3/include -I../include -fno-common -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -DSTM32F4 --static -lc -lnosys -L/usr/src/libopencm3/lib -L/usr/src/libopencm3/lib/stm32/f4 -Tstm32f4-discovery.ld -nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lopencm3_stm32f4 -o i2c.o i2c.c 

/usr/src/libopencm3/lib/libopencm3_stm32f4.a(vector.o): In function `reset_handler': 
/usr/src/libopencm3/lib/stm32/f4/../../cm3/vector.c:89: undefined reference to `main' 

這樣反而不鏈接的東西。

%.o: %.c 
    @#printf " CC  $(subst $(shell pwd)/,,$(@))\n" 
    $(Q)$(CC) $(CFLAGS) -o [email protected] -c $< 

libdatmos.a: $(BINARIES:=.o) Makefile 
    $(Q)$(AR) rcs [email protected] $(BINARIES:=.o) 

嘗試鏈接一切,當我建立我的程序(lsm303.bin)。但是當我這樣做時,它看起來像libopencm3沒有鏈接到我的靜態庫。

arm-none-eabi-gcc -o lsm303.elf lsm303.o -lopencm3_stm32f4 -ldatmos --static -lc -lnosys -L/usr/src/libopencm3/lib -L/usr/src/libopencm3/lib/stm32/f4 -L../util/lib/ -Tstm32f4-discovery.ld -nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 

../util/lib//libdatmos.a(i2c.o): In function `i2c_setup': 
/home/subsidence/stm32f4/util/lib/i2c.c:19: undefined reference to `i2c_reset' 
/home/subsidence/stm32f4/util/lib/i2c.c:20: undefined reference to `i2c_peripheral_disable' 
/home/subsidence/stm32f4/util/lib/i2c.c:22: undefined reference to `i2c_set_clock_frequency' 
. 
. 

對此有何見解?我應該在建立它時連接我的圖書館嗎?

+0

統計ic庫只是編譯對象的簡單歸檔,所以當你構建一個靜態庫時,就不會有像共享庫或可執行文件那樣的鏈接過程。如果沒有鏈接,編譯器將不會檢查符號引用,因此即使靜態庫使用libopencm3,libopencm3也不會打包到您的庫中。簡而言之,當您使用靜態庫編譯程序時,應該鏈接到庫和libopencm3。但是,當然,您可以將libopencm3.a解壓並將其包裝到您自己的庫中。 – TwilightSun

+0

感謝TwilightSun回答我在編譯時連接靜態庫的問題。但我實際上試圖在那裏的最後階段把所有事情聯繫起來。由於某種原因,它不工作。 – Yakubs

+0

嘗試將** - lopencm3_stm32f4 -ldatmos **換成** - ldatamos -lopencm3_stm32f4 **。這個有趣問題的答案可能會幫助你理解爲什麼:http://stackoverflow.com/a/409470/1579514。我會組織這些答案。 – TwilightSun

回答

0

這是我的總結髮言:

  • 包裝編譯的對象文件時,靜態庫,因爲鏈接尚未參與你不會得到的依賴問題。
  • 您必須鏈接到鏈接階段中由程序直接使用的其他庫所依賴的所有庫。鏈接到靜態庫時,應該根據依賴關係對它們進行排序。如果A依賴B,那麼A進入前B.(提示:如果依靠基於B而B也要靠A,使用-LA -Lb -LA)

鏈接到其它相關的問題:

+0

排序是我的問題。謝謝。 – Yakubs