我有一些代碼可以用於不同的嵌入式項目,所以我決定創建一個庫。該庫建立在另一個更廣泛的靜態庫(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'
.
.
對此有何見解?我應該在建立它時連接我的圖書館嗎?
統計ic庫只是編譯對象的簡單歸檔,所以當你構建一個靜態庫時,就不會有像共享庫或可執行文件那樣的鏈接過程。如果沒有鏈接,編譯器將不會檢查符號引用,因此即使靜態庫使用libopencm3,libopencm3也不會打包到您的庫中。簡而言之,當您使用靜態庫編譯程序時,應該鏈接到庫和libopencm3。但是,當然,您可以將libopencm3.a解壓並將其包裝到您自己的庫中。 – TwilightSun
感謝TwilightSun回答我在編譯時連接靜態庫的問題。但我實際上試圖在那裏的最後階段把所有事情聯繫起來。由於某種原因,它不工作。 – Yakubs
嘗試將** - lopencm3_stm32f4 -ldatmos **換成** - ldatamos -lopencm3_stm32f4 **。這個有趣問題的答案可能會幫助你理解爲什麼:http://stackoverflow.com/a/409470/1579514。我會組織這些答案。 – TwilightSun