ホームページ > バックエンド開発 > C++ > ユニークな共有ライブラリの問題

ユニークな共有ライブラリの問題

Patricia Arquette
リリース: 2025-01-28 14:03:11
オリジナル
360 人が閲覧しました

Unique Shared Library Problem

課題:共有ライブラリのリンク

私は最近、ソース製のライブラリをローカル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>
    ログイン後にコピー
調査により、明らかな非互換性が明らかになりました。CCCとコンパイルされた共有ライブラリは、GCCにリンクしたときに問題があるように見えますが、逆シナリオは問題なく機能します。これは、プロジェクトのすべての部分に同じコンパイラを使用するため、私が以前にこの問題に遭遇したことがなかった理由を説明する可能性があります。 この非互換性の根本的な原因は不明のままですが、異なるコンパイラと構築されたライブラリを統合する際の潜在的な落とし穴を強調しています。 誰かが回避策を知っているなら、私はそれを聞くことに非常に興味があります。

以上がユニークな共有ライブラリの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート