我有一个没有共享库的静态库liborc-0.4.a。我有另一个库,libschroedinger-1.0.a(没有共享)依赖于liborc-0.4.a中的符号。如果我在liborc-0.4.a上运行nm,则orc_init等符号显示为T(表示已定义)。我使用命令行标志-lorc-0.4构建了libschroedinger-1.0.a,所以它看到符号并且没问题。
但是,现在我有一个小的可执行文件,它依赖于libschroedinger-1.0.a。它编译得很好,但是当我运行链接器时
gcc -lschroedinger-1.0 -lorc-0.4 -o output input.o
它会出现以下错误:
/usr/local/lib/libschroedinger-1.0.a(libschroedinger_1.0_la-schro.o):schro.c:(.text+0x21):
undefined reference to `orc_init'
答案 0 :(得分:9)
gcc
对库的顺序很敏感。当它正在编译liborc-0.4.a
时,不需要orc_init
,所以它不包括在内。解决方案是将LDFLAGS
放在命令的末尾:
gcc -o output input.o -lschroedinger-1.0 -lorc-0.4
答案 1 :(得分:0)
您最有可能使用共享liborc编译libschroedinger。静态库与归档中的一堆目标文件相同,因此它们不需要查看多个标题。写如下以确保(与liborc相同的苹果)。
gcc /path/to/libschroedinger-1.0.a /path/to/liborc-0.4.a -o output input.o