0

プロジェクトのビルドに 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
4

1 に答える 1

3

これは、リンカーの--as-neededオプションが使用されているためです。つまり、ライブラリの一部であるソースでシンボルが実際に見つかるまで、ライブラリはリンクされません。コンパイル コマンドでリンクする前に、ソース ファイルを移動する必要があります。Makefileルールprogramを から$(CC) -L. -lrary -o $@ $<に変更してみてください$(CC) $< -L. -lrary -o $@--no-as-neededまたは、リンカーに渡すこともできます$(CC) -Wl,--no-as-needed -L. -lrary -o $@ $<。最初の方法は、使用するのに適しています。
お役に立てれば!

于 2012-05-04T19:44:45.597 に答える