課題:共有ライブラリのリンク
私は最近、ソース製のライブラリをローカルCプロジェクトに統合しながら、リンクの問題に遭遇しました。 リンカーは、共有ライブラリに対してリンクしようとしたときにundefined reference
エラーを報告しました。 以下に示すものと同様に、エラーメッセージは、リンカーがライブラリ内で定義されているシンボルを見つけることができなかったことを示しました。
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main': main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks' ... (other undefined references) ... collect2: error: ld returned 1 exit status make: *** [Makefile:7: all] Error 1</code>
手順のトラブルシューティング
最初のトラブルシューティングには、さまざまな方法を使用してライブラリを複数回再コンパイルすることが含まれます。 調査により、32ビットと64ビットのツールチェーンに関連する同様の問題を説明するフォーラム投稿に導かれました。 私の環境は64ビットとして確認されましたが、これによりコンパイラ自体を検討するようになりました。 予期しないソリューション:コンパイラーの切り替えGCCからClangに切り替え、コンピレーションとリンクは完璧に機能しました。 解決策の明らかな単純さと過去のプロジェクトにおける同様の問題の欠如を考えると、これは驚くべきことでした。
制御された実験
さらに調査するために、単純なテストケースを作成しました。Clangでコンパイルされた共有ライブラリ(
lib.h:libm.so
add
main.c
lib.c:
<code class="language-c">#pragma once int add(int a, int b);</code>
main.c:
<code class="language-c">#include "lib.h" int add(int a, int b) { return a + b; }</code>
build_so.sh(clang):
<code class="language-c">#include "lib.h" #include <stdio.h> int main () { printf("4+3=%d\n", add(4, 3)); return 0; }</code>
build_main.sh(gcc):
<code class="language-bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fPIC -o libm.so lib.o</code>
エラーが発生しました。 ただし、Clangを使用するようにスクリプトを変更すると、問題は解決されました。 さらなる実験により、コンパイラの役割(ライブラリのGCC、メインプログラムのClang)が逆転し、この組み合わせは正しく機能しました。
結論:コンパイラの非互換性<code class="language-bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
以上がユニークな共有ライブラリの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。