10

cygwin を使用して、makefile を使用して、他の誰かが作成したプログラムをコンパイルしようとしています。多くのエラー メッセージが表示されますが、そのうちの多くはerror: template with C linkage.

少し調べてみると、問題は に関連しているようextern "C"です。この行は、ヘッダーの 1 つに含まれているファイルcygwin/usr/include/pthread.hに含まれています。#include < pthread.h >この行を削除すると、ほとんどのエラー メッセージが消えます。しかし、次の種類のものがいくつか残っています。

/usr/include/pthread.h:67:5: error: previous declaration of ‘int pthread_atfork(void (*  )(),void ( *)(), void ( *)())’ with ‘C++’ linkage

/usr/include/sys/unistd.h:136:5: error: conflicts with new declaration with ‘C’ linkage

これを修正する方法を知っている人はいますか?座って、このすべてのことを詳細に学びたいのですが、このプログラムを実行する必要があるまで時間がありません..

4

3 に答える 3

12

編集: コメントの交換に基づいて、原因はシステム インクルード ファイル /usr/include/endian.h と競合するビルド ディレクトリ (Endian.h) 内のヘッダー ファイルでした。システムヘッダーの代わりに含まれていたため、ビルドの問題が発生していました。Windows では大文字と小文字が区別されないため、ファイルが競合していました。根本的な原因は、元の回答で提案されたものでした。テンプレートが定義されている場所で、extern C コンストラクトが意図せずに C++ コードにリークし、示されたエラーが発生していました。

ヘッダーファイルのどこかに「ぶら下がっている」Cリンケージ構造がないかどうかを確認します。これは、あなたが書いたコードにあります (システム ヘッダーではなく、おそらく安全です)。

ヘッダー内のコードは、

上に:

#ifdef __cplusplus
extern "C" {
#endif

そして一番下に:

#ifdef __cplusplus
}
#endif

下部が欠落している場合、上部半分の効果が意図せずに他のヘッダーのコードに拡張されます。これにより、発生しているような問題が発生します。

于 2013-08-28T18:13:28.677 に答える
10

この問題は、コンパイラが C と C++ コードの混合をコンパイルしているときに発生します。extern "C" 構文は、C コンパイラもこの関数にアクセスする必要があることを C++ コンパイラに伝える方法です。C コンパイラはこの extern の使用法を理解しないため、通常は次のように非表示にします。



    #ifdef __cplusplus
    extern "C" {
    #endif
void whatever();
#ifdef __cplusplus } #endif

ただし、システム ヘッダーを変更するべきではありません。それらが間違っている可能性は非常に低いです。独自のヘッダーの 1 つに上記の右中括弧が欠落している可能性があります。

于 2013-08-28T17:57:50.087 に答える
3

受け入れられた答えとの類似性、これは私にとっても入れ子の問題でしたが、ifdef/endifではそうではなかったので、他の人の参考として追加しています。

私の場合、このエラーはネストされた構造が原因でしたextern "C"。コンストラクトを含む 1 つのヘッダー ファイルが別のコンストラクト内extern "C"に含まれていたため、コンパイラ/プリプロセッサを混乱させるネストが発生していました。 extern "C"

ファイルああ:

#ifdef __cplusplus
extern "C"{
#endif

#include "b.h"

#ifdef __cplusplus
}
#endif

ファイル bh

#ifdef __cplusplus
extern "C"{
#endif

void someFunctionDeclaration();

#ifdef __cplusplus
}
#endif

#include "b.h"構成の外側を移動するとa.h extern "C"、問題が修正されます。

于 2016-12-05T06:43:07.440 に答える