将C程序与C ++库链接(GCC 4.5+)

时间:2012-05-04 17:42:36

标签: gcc g++ shared

我正在使用gcc / g ++ 4.4来构建我的项目,现在我正在尝试切换到gcc 4.5,但在将C程序与C ++库链接时会出现奇怪的“未定义引用”错误。这是我的测试用例:

  • 由source.c

    #ifdef LIBRARY
    extern "C" int one() {
        return 1;
    }
    #else
    #include <stdio.h>
    int one();
    int main() {
        printf ("%i\n", one());
        return 0;
    }
    #endif
    
  • 生成文件

    all: clean program
    program: source.c library.so
        $(CC) -L. -lrary -o $@ $<
    library.so: source.c
        $(CXX) -shared -DLIBRARY -fPIC -o $@ $<
    .PHONY: clean
    clean:
        rm -f program library.so
    

使用GCC 4.4时,一切正常:

$ CXX=g++-4.4 CC=gcc-4.4 make
rm -f program library.so
g++-4.4 -shared -DLIBRARY -fPIC -o library.so source.c
gcc-4.4 -L. -lrary -o program source.c

但在使用GCC 4.5时无法正常工作:

$ CXX=g++-4.5 CC=gcc-4.5 make
rm -f program library.so
g++-4.5 -shared -DLIBRARY -fPIC -o library.so source.c
gcc-4.5 -L. -lrary -o program source.c
/tmp/ccC4kNHP.o: In function `main':
source.c:(.text+0xa): undefined reference to `one'
collect2: ld returned 1 exit status
make: *** [program] Error 1

或GCC 4.6:

$ CXX=g++-4.6 CC=gcc-4.6 make
rm -f program library.so
g++-4.6 -shared -DLIBRARY -fPIC -o library.so source.c
gcc-4.6 -L. -lrary -o program source.c
/tmp/ccxNRNSS.o: In function `main':
source.c:(.text+0xa): undefined reference to `one'
collect2: ld returned 1 exit status
make: *** [program] Error 1

任何人都可以解释这个问题吗?

PS:这个是使用4.6构建的:

$ nm -D library.so
                 w _Jv_RegisterClasses
0000000000201010 A __bss_start
                 w __cxa_finalize
                 w __gmon_start__
0000000000201010 A _edata
0000000000201020 A _end
00000000000005a8 T _fini
0000000000000458 T _init
000000000000055c T one

1 个答案:

答案 0 :(得分:2)

这是因为使用了链接器的--as-needed选项,即直到在作为库的一部分的源中实际找到符号之后才链接库。您应该在编译命令中链接之前移动源文件。您可以尝试将Makefile规则program$(CC) -L. -lrary -o $@ $<更改为$(CC) $< -L. -lrary -o $@。或者,您可以将--no-as-needed传递给链接器,即$(CC) -Wl,--no-as-needed -L. -lrary -o $@ $<。第一种方法更适合使用 希望这有帮助!