mingw (Windows 用 gcc) でコンパイルする C++ プログラムがあります。gcc 4.4.1 を含む mingw の TDM リリースを使用します。実行可能ファイルは、2 つの静的ライブラリ (.a) ファイルにリンクしています。そのうちの 1 つは C で記述されたサードパーティ ライブラリです。もう 1 つは、私が作成した C++ ライブラリで、C ライブラリを使用して独自の C++ API を提供します。
C ライブラリの機能の (私の見解では、過度の) 一部がインライン関数で実装されています。C ライブラリの API を使用するときにインライン関数を含めることは避けられませんが、すべてをリンクしようとすると、すべてのインライン関数の複数の定義があるというリンク エラーが発生します。私のC++ラッパーライブラリと私が持っていないライブラリで呼び出された場合、基本的にヘッダーでインラインで定義されたものはすべて、CライブラリとC++ライブラリの両方で作成された関数を取得しています.
インクルード ファイルが同じプロジェクト内の異なる .c または .cpp ファイルで複数回使用されている場合、複数の定義エラーは発生しません。問題は、ライブラリごとに 1 つの定義が生成されることだけです。
コンパイラが両方のライブラリでこれらのインライン関数の関数とシンボルを生成する方法/理由は? コードでそれらの生成を強制的に停止するにはどうすればよいですか? .a ファイルから重複した関数を削除するために実行できるツール、またはリンカーに複数の定義を無視させる方法はありますか?
(参考までに、サードパーティのライブラリには、すべてのヘッダーに #ifdef __cplusplus および extern "C" ガードが含まれています。とにかく、それが問題である場合、シンボルの複数定義は発生しません。シンボルが定義されていないか、少なくとも異なります。)
特に、サード パーティの C ライブラリの DLL にリンクすると、リンク エラーは発生しません。ただし、DLLから呼び出す必要がある独自のバージョンの関数を持つコードに関係しているように見える奇妙なランタイムエラーが発生します。(あたかもコンパイラが私が求めていない関数のローカル バージョンを作成しているかのように。)
この質問の同様のバージョンが以前に尋ねられましたが、これらのいずれにおいても私の状況に対する答えが見つかりませんでした:
この質問に対する答えは、ポスターが変数を複数定義しているということでした。私の問題は、インライン関数の複数の定義です: 複数の cpps に同じヘッダーを含めることによる複数の定義エラーの繰り返し
これは MSVC プログラムでしたが、mingw を使用しています。また、この質問でのポスターの問題は、ヘッダー内のクラス本体の外側にある C++ クラス コンストラクターの定義でしたが、私の問題はインラインの C 関数にあります: Static Lib Multiple Definition Problem
この愚か者はすべての C コードの名前を C++ ファイルに変更しましたが、彼の C コードは C++ セーフではありませんでした: リンク時に多数の std:: 関数を複数定義する
これは、1 つの定義ルールに違反してもエラーにならない理由を知りたいだけでした: 定義が異なるインライン関数の予測できない動作