Xcode 重複シンボル _main
-
22-09-2019 - |
質問
Appcelerator Titanium によって生成された iPhone アプリケーションをコンパイルしようとすると、Snow Leopard 10.6.2 上の Xcode 3.2.1 で次のエラーが発生します。ただし、ビルド エラーは、アーキテクチャ メニューで iPhone シミュレーターを選択した場合にのみ表示され、iPhone デバイスを選択すると、デバイス上でアプリを実行できます。
さらに、iPhone シミュレーターは正常に起動し、Xcode を使用して をビルドする Titanium 環境からプログラムを直接実行します。
なぜこうなった ?
ld: duplicate symbol _main in Resources/libTitanium.a(main.o) and /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build/Objects-normal/i386/main.o collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
解決
なぜこれが起こっている私はあなたを伝えることはできませんが、私は、回避策を提案することができます。私は私のチタンプロジェクトのために生成されたmain.mファイルの内容全体をコメントアウトすると、私は正常にコンパイルし、シミュレータ上で実行することができました。私はあなたのためであれば、その作品を知ってみましょう。
他のヒント
あなたのプロジェクトの主な機能の複数の宣言を持っているかどうかを確認します。
私はこれとの戦いに数時間を費やしました。-all_load リンカー フラグを使用していたためです。カテゴリのバグを回避するためにそのフラグを使用している場合は、他の解決策がいくつかあります -- を参照してください。 ここ.
私は同様の問題がありました。ユニットテストクラスが誤って私のビルドに含まれていました。あなたのプロジェクトが検索した場合、「メイン(」あなたはおそらく重複した機能を見つけることができます。
これは2つの理由のために私に起こっます:
1:クラスAクラスBを呼び出し、両方が同じクラスを輸入していました。 .mファイル内のクラスをインポートして、それを修正します。
2:2つのクラスは、(定数は.mファイルで定義されている場合でも)同じ名前を持つ定数を持っています。定数の名前を変更することで、それを修正します。
私はこの問題を抱えます:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
}
そしてまた、ファイルmain.mを持っています:
int main(int argc, char* argv[])
{
@autoreleasepool {
int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
return retVal;
}
}
は思えます。鉱山は異なっていました。私はあなたの方法、あなたのビューコントローラの.hの実装に.xibイベントセレクタからドラッグすることができヒントを読んで、それが希望オートGEN。それはやった - クールでした。私はすぐに重複したシンボルエラー入門 - 。冷却されませんでした。
私は何が起こったかを確認するために、リンカに深く掘るための時間を持っていませんでした。私は、新しいビューコントローラを作成した新しい男に私の古い.xibのコンテキストをコピーしました。古い.H、.Mと.xibを削除して構築され、それが再び働きました。非常に奇妙な、非常に迷惑な時間の無駄。
いくつかのバグは、このXcodeの "利便性" と明らかにあります。
私は、これは私がそれの主な機能と実装ファイルを持っていたときの状況(abc.mを言う)と、別のmain.m
を持っていた見つけました。私はabc.m
のmain関数をコメントアウトすると、プロジェクトが正常にコンパイルます。
私はこれらの他の回答から伝えることができるものオフに基づいて、私はmain
方法の束を削除する必要がありますつもりです。
しかし、それを行うには簡単に私彼らは熱心にコメントして文書化されているので、ほぼすべての他のラインで私のファイルからすべてのGDのコメントを削除する最初の必要性
この正規表現は、その区切り文字を含むすべてのC複数行のコメントと一致する&あなたの旅
であなたを助けるかもしれません/\*((?!\*/).)*\*/
私は私のために働い正しい答えが、何を探しに多くの時間も費やしました。 最後に、それは自己が何かを伝えるのXcodeが重複しているので、この場合には(その特定のフォルダに移動:/Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build/をオブジェクト・ノーマル/ I386 / main.o)と、すべてのファイルを削除しても、はい、それを削除した場合、その特定のクラス/インタフェースが2回宣言されているかどうか、あなたのプロジェクトで同じチェック。
削除した後、クリーンでプロジェクトを実行します。
これが私のために働いていた、これは(-_-)に役立ちます願っています。
削除/Users/{username}/Library/Developer/Xcode/DerivedData
フォルダおよびビルドます。