1

少数のCソースファイルをObjective-CiOSプロジェクトに統合すると、リンクエラーが発生します。

Cファイルは、cプロジェクトとPythonプロジェクトでコードを正常に使用した別の開発者から提供されました。

XCodeプロジェクトにcソースコードを追加すると、コードはコンパイルされますが、Cコードを参照するためにObjective Cファイルにコードを追加した後、リンクエラーが発生します。Cコードの変数で「重複シンボルエラー」が発生します。これは、ObjectiveCコードの拡張子が.mの場合です。

Objective Cファイルを.mm拡張子に変更すると、ObjectiveCコードから呼び出しているC関数に対して「アーキテクチャi386のシンボルが見つかりません」というエラーが発生します。

フォーラムにはCとObjectiveCについて多くの質問がありますが、私はまだ解決策を見つけていません。確認する簡単なことはありますか?

コードスニペット:

File: res.h

float Max_Std_Amp = 50;
void RD_Dispose(void);

File: res.c
void RD_Dispose(void) {
   Max_Std_Amp = 0;
}


File: Import.mm
#import "res.h"
void process(UInt32* data, UInt32 dataLength)
{
    RD_Dispose();
}

リンクエラー:

Import.mの拡張子が.mの場合:

duplicate symbol _Max_Std_Amp in:
    /Users/dayhacker/Library/Developer/Xcode/DerivedData/My_Project-dbvpktweqzliaefgbqbebtdgyrey/Build/Intermediates/My Project.build/Debug-iphonesimulator/Respitory Rate.build/Objects-normal/i386/Import.o

Import.mmの拡張子が.mmの場合:

Undefined symbols for architecture i386:
 "RD_Dispose()", referenced from:
 process(unsigned long*, unsigned long) in Import.o
4

1 に答える 1

1

解像度:

float Max_Std_Amp = 50;

それは次のようになります。

extern float Max_Std_Amp;

floatおよびソース ファイルで定義された実際の値 ( res.c):

float Max_Std_Amp = 50;

そうしないと、Max_Std_Ampを含むすべてのソース モジュールの一部になりますがres.h、これは意図したものではありません。

C++ から C 関数 ( .mmObjective-C++ である) を使用する場合は、次のように関数を C リンケージとして宣言する必要があります。

解像度:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

#ifdef __cplusplus
}  // extern "C"
#endif

上記のガード マクロと C リンケージ定義の使用により、res.hヘッダー ファイルを C と C++ (Objective-C と Objective-C++) の両方のソース モジュールに含めることができます。

于 2013-02-15T14:26:25.893 に答える