Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_XXX", referenced from: someFile
ld: symbol(s) not found for architecture arm64
很多人都遇到過引用文件報錯的問題,之所以會造成這個問題,主要還是導入文件時的步驟上出了問題。
比如你需要將所在YYY工程的A文件引入你的XXX工程,此時你有兩種操作方式。
1.打開YYY工程的A文件的文件夾,將A文件直接拖拽到XXX工程,此時會彈出下圖,直接添加。
2.打開YYY工程的A文件的文件夾,將A文件復制到XXX工程所需要的地方,然后通過下圖方式添加。
兩種方式的區別是,第一種方式所加的類、靜態庫和bundle資源文件不會自動加入到Compile Sources、Link Binary With Libraries和Copy Bundle Resources。以至于XXX工程根本找不到所加的文件。
所以必須通過第二種方式導入文件。
其他造成該問題的可以檢查Other Linker Flags、Header Search Paths和Library Search Paths的路徑是否正確。
-ObjC:加了這個參數后,鏈接器就會把靜態庫中所有的 Objective-C 類和分類都加載到最后的可執行文件中。
-all_load:會讓鏈接器把所有找到的目標文件都加載到可執行文件中,但是千萬不要隨便使用這個參數!假如你使用了不止一個靜態庫文件,然后又使用了這個參數,那么你很有可能會遇到 ld: duplicate symbol 錯誤,因為不同的庫文件里面可能會有相同的目標文件,所以建議在遇到 -ObjC 失效的情況下使用 -force_load 參數。
-force_load:所做的事情跟 -all_load 其實是一樣的,但是 -force_load 需要指定要進行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載。