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 $@ -c $<

libdatmos.a: $(BINARIES:=.o) Makefile
    $(Q)$(AR) rcs $@ $(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'
.
.

对此有何见解?我应该在构建库时链接我的库吗?

4

1 回答 1

0

这些是我总结的陈述:

  • 将编译后的目标文件打包到静态库时不会出现依赖问题,因为尚未涉及链接器。
  • 您必须链接到您的程序在链接阶段直接使用的其他库所依赖的所有库
  • 链接到静态库时,您应该根据依赖关系对它们进行排序。如果 A 依赖 B,则 A 在 B 之前。(提示:如果 A 依赖 B,而 B 也依赖 A,请使用 -lA -lB -lA)

其他相关问题的链接:

于 2014-01-07T03:53:23.910 回答