iOS duplicate symbol _main in:問題解決
今日は自分に穴を掘って、工事の中のいくつかのファイルはバックグラウンドの小さい仲間が書いたC/C++ファイルなので、私は一度にすべてインポートしましたが、コンパイル時にduplicate symbolが現れました.main in:A.oとB.oのコンパイルエラー.
以下に最も簡単なDemo復元という光景を書きます.
新しいプロジェクトを作成し、新しいハローを作成します.hとハローcファイル、コードは以下の通りです.
Hello.h
Hello.c
そしてViewControllerでmでmain関数を使用します.
コンパイル時の具体的なエラーメッセージは以下の通りです.
エラーの原因は明らかです(私のDemoは本当に簡単すぎるから):
Hello.cファイルにmain関数があり、Helloにコンパイルされています.oファイルにsymbol_がありますmain.
工事の元のmain.mファイルにもmain関数があり、mainにコンパイルされています.oファイルにもsymbol_がありますmain.
1つの工事でmainが1つしかないので、衝突が発生しました.
解決方法:C/C++ファイルのmain関数を呼び出すか、関数名を書き換えるのではなく、関数の戻りタイプやパラメータリストを変更するだけではだめです.
後でduplicate symbolなどの問題に遭遇すると、この角度から考えることができます.問題は私たちが工事中に同名の方法や関数が現れたため、コンパイル時に衝突したことがよくあります.一方、コンパイル時のエラー情報A.oとB.oは、この2つの重複するsymbolがどの2つのファイルに表示されるかを識別し、プロジェクトでこの2つのファイルを開いて競合するメソッド名を検索して変更を比較します.
以下に最も簡単なDemo復元という光景を書きます.
新しいプロジェクトを作成し、新しいハローを作成します.hとハローcファイル、コードは以下の通りです.
Hello.h
#ifndef __Main__Hello__
#define __Main__Hello__
#include <stdio.h>
int main();
#endif /* defined(__Main__Hello__) */
Hello.c
#include "Hello.h"
int main() {
return 0;
}
そしてViewControllerでmでmain関数を使用します.
#import "ViewController.h"
#import "Hello.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
main();
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
コンパイル時の具体的なエラーメッセージは以下の通りです.
duplicate symbol _main in:
/Users/apple/Library/Developer/Xcode/DerivedData/Main-alxynewqhvyqdafbjcjfzntmqfml/Build/Intermediates/Main.build/Debug-iphonesimulator/Main.build/Objects-normal/i386/Hello.o
/Users/apple/Library/Developer/Xcode/DerivedData/Main-alxynewqhvyqdafbjcjfzntmqfml/Build/Intermediates/Main.build/Debug-iphonesimulator/Main.build/Objects-normal/i386/main.o
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
エラーの原因は明らかです(私のDemoは本当に簡単すぎるから):
Hello.cファイルにmain関数があり、Helloにコンパイルされています.oファイルにsymbol_がありますmain.
工事の元のmain.mファイルにもmain関数があり、mainにコンパイルされています.oファイルにもsymbol_がありますmain.
1つの工事でmainが1つしかないので、衝突が発生しました.
解決方法:C/C++ファイルのmain関数を呼び出すか、関数名を書き換えるのではなく、関数の戻りタイプやパラメータリストを変更するだけではだめです.
後でduplicate symbolなどの問題に遭遇すると、この角度から考えることができます.問題は私たちが工事中に同名の方法や関数が現れたため、コンパイル時に衝突したことがよくあります.一方、コンパイル時のエラー情報A.oとB.oは、この2つの重複するsymbolがどの2つのファイルに表示されるかを識別し、プロジェクトでこの2つのファイルを開いて競合するメソッド名を検索して変更を比較します.