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