2012-02-12 11 views
2

恐ろしい典型的なリンカエラー..アップルマッハ-Oリンカエラーは、原因ファイルの拡張子に

LD:記号(S) collect2はARMv6のアーキテクチャが見つかりません:ldは、しかし、1つの終了ステータス

を返さそれはファイル名によって引き起こされますか?私はC++/Objective-Cを使用しているので、Obj-Cファイルはすべて.mmですが、.cファイルを使用することはできません。たとえば、SFMTアルゴリズムを私のプロジェクトに含めました。これは私にこれらのエラーを与えていましたが、単一の.cファイルを.cppに変更するだけで、コードは消えてしまいました。私はヘッダーだけを含んでいるので、なぜこの違いがあるのか​​分かりません。

私はFreetype2を含むようにしていますが、これは同じ問題です(これは.cなのではっきりしていますが、それはすべてのファイルの名前を変更するには大きすぎます)。また、リンクされたバイナリなので、新しいファイル名で再コンパイルしない限り、変更することはできません。だから、これの背後にある本当の理由を見つける時が来ました。

なぜこのようなことが起こりますか? .cファイルのリンカーエラーを止める方法は?

+0

Freetypeのバイナリはどのように生成していますか?私はあなたがすでにこれを知っていると確信していますが、あなたはデスクトッププラットフォーム用にコンパイルされたlibfreetype.aだけではありません。 –

+0

このチュートリアルの後、私は4つのアーキテクチャすべてでバイナリを構築し、それらをunversal freetype.aに結合しました。 iOSシミュレータで同じエラーが発生するので、もう一度試してみます。だから、私はarm6/7が欠けているだけではありません。 – user1137704

+0

チュートリアルへのリンクを投稿していません。サードパーティ製のライブラリを使用する場合は、こちらの方法(http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/)を使用します。私がこの方法で得られる唯一の問題は、ライブラリ内の何かを変更すると、最初にCleanを行わない限り、アプリケーションは更新されたライブラリで再リンクされないということです。 –

答えて

0

あなたのFreetypeのはextern "C"ディレクティブ内に、ラップ:

// Non-C includes 
#include <iostream> 

extern "C" 
{ 
    #include <freetype/freetype.h> 
    // ... Other freetype includes 
} 

おそらくextern "C"ディレクティブ内#importの代わり#includeを使用することができます。私は試みたことはありませんが、なぜ動作しないのか分かりません。

+0

お役立ち情報これはSFMTの問題を解決しましたが、Freetypeは依然として不平を言っていますので、おそらくバイナリやリンケージに問題があります。迅速な対応に感謝します! – user1137704

0

これでCヘッダーファイルを囲みます。これはincludeを囲むこともできます。

#ifdef __cplusplus 
extern "C" {   
#endif  

// function declarations etc if this is your own header. 
// OR you can use this in the .mm file to surround your include. 
//... 

#ifdef __cplusplus  
};      
#endif 

これは、c関数の外部リンケージを指定します。 c .hファイルをインクルードするときにこれを行わないと、C++コンパイラはCコンパイラとは異なる方法でmangleを行い、リンカに問題を引き起こします。
extern "C"を使用すると、C++コンパイラに関数のCスタイルのマングリングを使用するように指示します。

+0

これは、OPが含める各Freetypeヘッダーに対して実行する必要があります。サードパーティのライブラリを変更すると、それらのライブラリが後で更新されるときのメンテナンスにつながります。 –

+0

良い点 - 私は最初にOPに第三者のlibが含まれていたことを忘れていました。それが彼自身のコードであれば、ヘッダーにリンケージ仕様を使用する方が好きかもしれません(したがって、インクルードごとにそれを行う必要はありません)。私はあなたの提案を含めるために私の答えを変更しました。 –

関連する問題