2

よく使う機能がありますf()。追加のコンパイルなしで簡単に使用できるようにf()、ヘッダーファイルに入れたい:util.hf()

user1.c:

#include "util.h"
int main(){
    f();
    return 0;
}

util.h:

void f(){
    // do some job
}

のコンパイルuser1.c:

gcc -o user1 user1.c

この問題は、2 つのコンパイル単位unit2.oとがある場合に発生しunit3.oます。それらのソースコードは次のとおりです。

user2.c:

#include "util.h"

void user2_function(){
     f();
     // do other jobs
}

user3.c:

#include "util.h"
extern void user2_function();
int main(){
    f();
    user2_function();
    return 0;
}

multiple definition of fこれらのソース コードを次のようにコンパイルしようとすると、エラーが発生します。

gcc -c user2.c
gcc -c user3.c
gcc -o user user2.o user3.o

問題は、問題をどのようにmultiple definition解決できるかです。または、より良い解決策はありますか?

実際には、何百もの関数がutil.hあり、約 50 の異なるコンパイル ユニットがあります。

次の理由から、ライブラリとユーティリティ関数のコンパイル手順の使用を避けようとしています。

  1. 私が使用するさまざまなプラットフォームがたくさんあります。
  2. cmake簡単な解決策、つまりを使用しないなどがあるのだろうか。
  3. また、コプロセッサーのクロス コンパイルも使用します。
  4. ユーティリティ関数のコンパイルで使用されるフラグを、ユーザー コードのコンパイルで使用されるフラグと同じにしたい。
4

2 に答える 2

7

実際には、ヘッダー ファイルで関数の本体を指定しています。したがって、オブジェクト コードは両方のオブジェクト ファイルに出力されますが、これは許可/有効ではありません。

これを修正するには、次のいずれかを行います。

  • 関数をマークするinline
  • 関数の前方宣言のみをヘッダー ファイルに配置し、本体を別のソース コード ファイルに指定します。このソース コード ファイルは、他のソース コード ファイルと共にコンパイルします。
于 2014-08-13T08:12:46.543 に答える