静态库链接问题(没有引用main或没有引用)

时间:2014-01-07 00:58:42

标签: c linker static-libraries libopencm3

我有一些代码可以用于不同的嵌入式项目,因此我决定创建一个库。该库建立在另一个更广泛的静态库(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'
.
.

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

1 个答案:

答案 0 :(得分:0)

这些是我的总结陈述:

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

与其他相关问题的链接: