Xcodeでコンパイルエラーが出たときの調べ方

このQ&Aのポイント
  • Xcodeでコンパイルエラーが発生し、エラーメッセージをネットで検索して解決する方法について説明します。
  • エラーメッセージから情報を読み取り、必要なライブラリやフレームワークを追加することで問題を解決できます。
  • 熟練したプログラマは、エラーメッセージを分析し、問題を特定するスキルがあります。
回答を見る
  • ベストアンサー

Xcodeでコンパイルエラーが出たときの調べ方

iPhone向けのメーラーを作ってみようと思い、LibEtPan というライブラリをGitHubから ダウンロードして、以下のURLにある pop-sample.c のサンプルコードを使ってみたところ エラーが出ました。 結論からいうとエラーメッセージをそのままネットで調べて、とりあえずコンパイルエラーは 発生しなくなり、無事、ライブラリを使う事はできたのですが、なぜ動くようになったのか、 今のコンパイルエラーが出ていない状態がはたして正しいのかがわかっておりません。 以下、エラー発生までのプロセスです。 1、新規でiPhone向けプロジェクトを作成 2、libEtPanをサブプロジェクトとして追加 3、libetpan-ios.a をLinkに追加 4、Other Linker Flagsに -lsasl2 を設定 5、pop-sample.cのサンプルコードをコピー (サンプルコード内にあるファイル書き込みの処理はコンソールにメール内容を表示する処理に置き換えた) 手順3と4は以下GitHubのREADMEに書いてある手順です。 https://github.com/dinhviethoa/libetpan この状態でビルドすると、以下のようなエラーが発生しました。 Undefined symbols for architecture i386: "_SecCertificateCopyData", referenced from: _mailstream_low_cfstream_get_certificate_chain in libetpan-ios.a(mailstream_cfstream.o) "_deflate", referenced from: _mailstream_low_compress_write in libetpan-ios.a(mailstream_compress.o) "_deflateEnd", referenced from: _mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o) _mailstream_low_compress_free in libetpan-ios.a(mailstream_compress.o) "_deflateInit2_", referenced from: _mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o) "_inflate", referenced from: _mailstream_low_compress_read in libetpan-ios.a(mailstream_compress.o) "_inflateEnd", referenced from: _mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o) _mailstream_low_compress_free in libetpan-ios.a(mailstream_compress.o) "_inflateInit2_", referenced from: _mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o) "_kCFStreamPropertySSLPeerCertificates", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) _mailstream_low_cfstream_get_certificate_chain in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamPropertySSLSettings", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamSSLAllowsAnyRoot", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamSSLAllowsExpiredCertificates", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamSSLAllowsExpiredRoots", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamSSLLevel", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) "_kCFStreamSSLValidatesCertificateChain", referenced from: _mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o) ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) そこで、上記のエラーメッセージをネットで検索し、結果的には以下のことをすることで、コンパイルエラーが 解消しました。 ・CFNetwork.framework と Security.framework のLink追加 ・Other Linker Flags に -lz の追加 そこで、質問ですが、熟練したプログラマは、上記のようなエラーが出たとき、 そのエラーメッセージからどういう情報を読み取り、どのようなプロセスで問題を 解決するのでしょうか? 私は、上記のエラーメッセージを見ても「Undefined symbols」というメッセージから 何かライブラリが足りないのかな?程度しか情報を読み取る事ができませんでした。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> 私は、上記のエラーメッセージを見ても「Undefined symbols」というメッセージから > 何かライブラリが足りないのかな?程度しか情報を読み取る事ができませんでした。 このメッセージから読み取れることだったら、熟練者でも大体同じだと思います。 あとは ○ これが発生しているのは、リンク工程 Undefined Symbolsというエラーからも判断できるし > ld: symbol(s) not found for architecture i386 > clang: error: linker command failed with exit code 1 (use -v to see invocation) とリンカでエラーになっていることが明記されている → ソースコードからオブジェクトファイルへコンパイルするのは成功しているようである ○ "_SecCertificateCopyData" 等が具体的な「未定義シンボル」 →ソースコードには、 先頭の _ を除いた「SecCertificateCopyData」等が使われている →必要なライブラリ/フレームワークを探すためのヒント くらいでしょうか。

smamusy
質問者

補足

回答ありがとうございました! >→ ソースコードからオブジェクトファイルへコンパイルするのは成功しているようである なるほど。 コンパイルとリンクの違いもよくわかってなかったんですが、 コンパイルは成功しているが、リンクで失敗しているということがわかると、 コードの文法的な誤りはないけど、ライブラリなどのリソースが足らない ということがわかるのですね。 >→ソースコードには、 先頭の _ を除いた「SecCertificateCopyData」等が使われている >→必要なライブラリ/フレームワークを探すためのヒント SecCertificateCopyDataがどのライブラリ/フレームワークに含まれているかは、 やはり、Webで検索するなどして調べるしかないものなんですね。 もしくは、製品のマニュアルなどに記載されるべきものということでしょう。 大変参考になりました。 ありがとうございました。

関連するQ&A

  • Xcodeでのエラーについて

    MacでOpenCVを利用してKinectを扱おうとしているのですが、以下のようなエラーが出ました。 ちょっと自分には解決できないのですが、どうすればいいか教えてください。 言語はC++です。 Undefined symbols for architecture x86_64: "_cvCreateImage", referenced from: _main in main.o "_cvCvtColor", referenced from: _main in main.o "_cvReleaseImage", referenced from: _main in main.o "_cvShowImage", referenced from: _main in main.o "_cvWaitKey", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

  • リンカのエラー

    SH-7144Fマイコンの開発をしています。 リンカで以下のようなエラーが出て困っています。 L2310 (E) Undefined external symbol "_set_imask_ccr" referenced in "C:\Users\***\Desktop\***\***\Debug\isac.obj" machine.hはincludeしていますし、何が原因かわかりません。 IDEはHEW4を使用しています。 何方かお願いします。

  • boost::filesystemのコンパイル

    こんにちは。 現在boost::filesystemについて勉強しているのですが、サンプルプログラムを用いてコンパイルをしようとするとエラーが発生します。 OSは、Mac OS Xで、boostは1.46.1です。 インストール(bjamなど)は、完了しているはずです(できてなかったらごめんなさい) g++ test.cpp でコンパイルしようとすると以下のエラーメッセージが表示されます。 Undefined symbols: "boost::system::generic_category()", referenced from: __static_initialization_and_destruction_0(int, int)in ccv6DmNs.o __static_initialization_and_destruction_0(int, int)in ccv6DmNs.o "boost::system::system_category()", referenced from: __static_initialization_and_destruction_0(int, int)in ccv6DmNs.o "boost::filesystem3::detail::file_size(boost::filesystem3::path const&, boost::system::error_code*)", referenced from: boost::filesystem3::file_size(boost::filesystem3::path const&)in ccv6DmNs.o "boost::filesystem3::path::wchar_t_codecvt_facet()", referenced from: boost::filesystem3::path::codecvt() in ccv6DmNs.o ld: symbol(s) not found collect2: ld returned 1 exit status また、上記のエラーの一部を検索をかけて調べたところ g++ -lboost_system-mt -lboost_filesystem-mt test.cpp とコンパイルすればできると書かれていたのですが、 ld: library not found for -lboost_system-mt collect2: ld returned 1 exit status と表示されて、コンパイルできませんでした。 どうすればいいのかわからないので、教えて下さい。 よろしくお願いします。

  • Xcode8にしたらstdでエラーしました。

    Xcodeを用いてアプリを作成しています。 いままで↓の様な関数を使っていたのですが、Xcodeを8にバージョンアップしたところ Apple Mach-O Linker (Id) Error が発生してしまいます。 void function(std::vector<int>& a); 解決方法がわかる方いましたら、よろしくお願いします。

  • Compress:Zlibコンパイルエラー

    Compress::Zlibのコンパイルが出来ずに困っています。 ■ソース展開後のディレクトリにて % perl Makefile.PL Parsing config.in... Building Zlib enabled Looks Good. Up/Downgrade not needed. Checking if your kit is complete... Looks good Writing Makefile for Compress::Zlib ■コンパイル実行(make) mkdir blib (中略) mkdir blib/man3 cp Zlib.pm blib/lib/Compress/Zlib.pm AutoSplitting blib/lib/Compress/Zlib.pm (blib/lib/auto/Compress/Zlib) /usr/local/bin/perl -I/usr/local/lib/perl5/5.00503/sun4-solaris -I/usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/5.00 503/ExtUtils/xsubpp -typemap /usr/local/lib/perl5/5.00503/ExtUtils/typemap -typemap typemap Zlib.xs >xstmp.c && mv xstm p.c Zlib.c gcc -B/usr/ccs/bin/ -c -I./zlib-src -I/usr/local/include -O3 -DVERSION=\"1.38\" -DXS_VERSION=\"1.38\" -fPIC -I/usr/lo cal/lib/perl5/5.00503/sun4-solaris/CORE Zlib.c Zlib.xs: In function `SetGzErrorNo': Zlib.xs:129: parse error before `char' (中略) Zlib.xs:282: `nl' undeclared (first use in this function) gcc: file path prefix `/usr/ccs/bin/' never used make: *** [Zlib.o] Error 1 このエラーが出て、どうしても進めません。 zlibはzlib-1.2.3をインストールしました。 Compress-Zlib-1.38.tar.gzをCPANから取得してインストールしようとすると、上記のエラーとなります。 経験者の方、是非教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • mysql/rubyのインストールが出来ません。

    OS:MacOSX10.5.1 ruby:1.8.6 rails:2.0.2 macにmysql/rubyをインストールしようとしているのですがmakeすることが出来ず困っています。エラー内容は以下の通りです Macintosh:mysql-ruby-2.7.3 atsuhiroteshima$ make cc -arch ppc -arch i386 -pipe -bundle -o mysql.bundle mysql.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch ppc -arch i386 -lruby -L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -lpthread -ldl -lm ld: warning in /usr/local/mysql/lib/mysql/libmysqlclient.dylib, file is not of required architecture Undefined symbols for architecture ppc: "_mysql_store_result", referenced from: _store_result in mysql.o _query in mysql.o "_mysql_stmt_errno", referenced from: _mysql_stmt_raise in mysql.o _stmt_prepare in mysql.o _stmt_result_metadata in mysql.o "_mysql_stmt_error", referenced from: _mysql_stmt_raise in mysql.o "_mysql_options", referenced from: _options in mysql.o      (中略) "_mysql_fetch_field", referenced from: _fetch_field in mysql.o "_mysql_get_proto_info", referenced from: _proto_info in mysql.o "_mysql_errno", referenced from: _mysql_raise in mysql.o _my_errno in mysql.o "_mysql_error", referenced from: _mysql_raise in mysql.o _my_error in mysql.o "_mysql_escape_string", referenced from: _escape_string in mysql.o ld: symbol(s) not found for architecture ppc collect2: ld returned 1 exit status lipo: can't open input file: /var/folders/+b/+b2BrDwnESy62VzzTJy9k++++TI/-Tmp-//cc8ile28.out (No such file or directory) make: *** [mysql.bundle] Error 1 どなたかこのエラーの解決方法を教えていただけないでしょうか。 お願いします。

  • Mac C Undefined x86_64

    C言語の勉強中です。 大学にいたころにLinuxで作ったプログラミングを自分のMacで動かしてみようと思い、コンパイルをかけると、Undefined symbols for architecture x86_64とでました。これを解決したいです。MacOSX LionのIntel Core 2 duo です。僕の試したことを一通り書きます。 僕の動かしたいプログラムのソースの#includeに <FTGL/ftgl.h><GL/glfw.h> とか見慣れないのがあったので、 FTGLをmacportで入れて、glfwをダウンロードし、GLをGLUTに変えてコンパイル cc -I /opt/local/include project.c -o project -framework OpenGL -framework GLUT -lobjc (-I /opt/local/includehはFTGLの入っている場所です) project.c:10:23: error: GLUT/glfw.h: No such file or directory うん?glfw.hをGLUTの中にコピーしたのになぁ?とりあえず現在のディレクトリにglfw.hをコピーし#include "glfw.h"に変更し再びコンパイル Undefined symbols for architecture x86_64: "_ftglRenderFont", referenced from: _outtextxy in ccvINkhN.o "_glfwInit", referenced from: _main in ccvINkhN.o "_glfwOpenWindow", referenced from: _main in ccvINkhN.o "_ftglCreateExtrudeFont", referenced from: _main in ccvINkhN.o "_ftglSetFontFaceSize", referenced from: _main in ccvINkhN.o "_ftglSetFontDepth", referenced from: _main in ccvINkhN.o "_ftglSetFontOutset", referenced from: _main in ccvINkhN.o "_ftglSetFontCharMap", referenced from: _main in ccvINkhN.o "_glfwGetWindowParam", referenced from: _main in ccvINkhN.o "_glfwGetWindowSize", referenced from: _main in ccvINkhN.o "_glfwGetMouseButton", referenced from: _main in ccvINkhN.o "_glfwSwapBuffers", referenced from: _main in ccvINkhN.o "_glfwTerminate", referenced from: _main in ccvINkhN.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status x86_64はたしか64-bitとかそんな感じの意味だった気が?学校のパソコン古かったしなんか違うのかなー?と思い -m32 -I /opt/local/include project.c -o project -framework OpenGL -framework GLUT -lobjc としてコンパイルを試みると Undefined symbols for architecture i386: "_ftglRenderFont", referenced from: _outtextxy in ccePdBJk.o "_glfwInit", referenced from: _main in ccePdBJk.o "_glfwOpenWindow", referenced from: _main in ccePdBJk.o "_glfwGetKey", referenced from: _main in ccePdBJk.o "_ftglCreateExtrudeFont", referenced from: _main in ccePdBJk.o "_ftglSetFontFaceSize", referenced from: _main in ccePdBJk.o "_ftglSetFontDepth", referenced from: _main in ccePdBJk.o "_ftglSetFontOutset", referenced from: _main in ccePdBJk.o "_ftglSetFontCharMap", referenced from: _main in ccePdBJk.o "_glfwGetWindowParam", referenced from: _main in ccePdBJk.o "_glfwGetWindowSize", referenced from: _main in ccePdBJk.o "_glfwGetMouseButton", referenced from: _main in ccePdBJk.o "_glfwSwapBuffers", referenced from: _main in ccePdBJk.o "_glfwTerminate", referenced from: _main in ccePdBJk.o ld: symbol(s) not found for architecture i386 うん?よく分からないがたしかi386は32-bitの意??どっちでやってもダメ??? うる覚えの知識を乱用し 再起動時に「2と3」を押しっぱなしにして(32-bitになる?)からのコンパイル→失敗 「6と4」を押しっぱなしにしてみる→失敗 sudo systemsetup -setkernelbootarchitecture x86_64 →失敗 sudo systemsetup -setkernelbootarchitecture i386 →失敗 sudo systemsetup -setkernelbootarchitecture default →失敗(そりゃそうですよね) うーん、ためしに gcc -vと打ってみると Target: i686-apple-darwin11とか Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.1~22/src/configure --disable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.1~22/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1 Thread model: posix とでてる よく分からないがi686とx86_64ばかりあるところからターゲットは64-bitで作っている? 試しにコンパイルの通った実行ファイルに file test と打ってみる test: Mach-O 64-bit executable x86_64 おお確かにdefaultは64-bitのようだ!今度は同じファイルに対して-m32をつけてコンパイルして、file test test: Mach-O executable i386 うむ。-m32も仕事をしているよう。 これはbitの違いではなく、ダウンロードしたやつのせいとか、僕の置き場所が悪いとか、あるいは別の原因なのでしょうか?レベルの低い質問ですいません。回答お待ちしております。

  • 箱庭諸島2+でコンパイルエラー

    Windows XP SP3 + GCC4.4.0を使っています。 「箱庭諸島の保管庫」というサイトから箱庭諸島2+をダウンロードしてきて、コマンドプロンプトから、解凍したディレクトリに移動し、makeを実行しました。すると、 g++ -c -O2 -Wall main.c In file included from main.c:1: main.h:5:21: error: iostream.h: No such file or directory In file included from main.h:6, from main.c:1: hako_io.h:5:20: error: fstream.h: No such file or directory In file included from info.h:7, from hako_io.h:12, from main.h:6, from main.c:1: value.h:30: error: 'ifstream' has not been declared In file included from hako_io.h:12, from main.h:6, from main.c:1: info.h:30: error: 'ifstream' has not been declared info.h:33: error: 'ofstream' has not been declared info.h:101: error: 'ifstream' has not been declared info.h:104: error: 'ofstream' has not been declared In file included from hako_io.h:14, from main.h:6, from main.c:1: map.h:32: error: 'ofstream' has not been declared map.h:35: error: 'ifstream' has not been declared map.h:185: error: 'ofstream' has not been declared map.h:188: error: 'ifstream' has not been declared In file included from hako_io.h:15, from main.h:6, from main.c:1: command.h:20: error: 'ifstream' has not been declared command.h:21: error: 'ofstream' has not been declared command.h:74: error: 'ifstream' has not been declared command.h:75: error: 'ofstream' has not been declared In file included from main.h:6, from main.c:1: hako_io.h:29: error: ISO C++ forbids declaration of 'ofstream' with no type hako_io.h:29: error: expected ';' before '*' token main.c: In function 'int main()': main.c:5: error: 'srandom' was not declared in this scope make: *** [main.o] Error 1 というエラーが出て、コンパイルされません。 原因はいったいどこにあるのでしょうか。 「ifstream」や「ofstream」といった単語が多く見られるので、そこがエラーの元だとは思うのですが… どなたか、知恵をお貸しいただけないでしょうか。

  • リンカーエラー

    質問させて頂きます。 windows XP mysql5.1 win devC++ の環境で、 http://ameblo.jp/nana-2007-july/entry-10086686152.html のサイトにそって、CからMYSQLに接続をしようと コンパイルすると、リンカーエラー main.o(.text+0x132) In function `main': [Linker error] undefined reference to `mysql_free_result@4' [Linker error] undefined reference to `mysql_real_connect@32' : : main.o(.text+0x132) ld returned 1 exit status Makefile.win [Build Error] [project1.exe] Error 1 とエラーがでています。 ご教授よろしくお願いします。

  • C++コンパイルエラーの原因を教えてください

    Cには詳しいのですが、C++があまりよくわかっておらず、質問させてください。 今回、手に入れたC++のあるプログラムをmakeしています(x86_64 Linux)。 以下のようなエラーが出てコンパイルできないのですが、何が悪いのか全く理解できず困っています。 他の環境ではコンパイルできているらしいので、わたしの環境の何が悪いのか、考えられることがありましたら、何でも書き込んでいただけると嬉しいです。 よろしくお願いします。 g++ -c -I../MathUtils -I../CommonUtils -DHAVE_ZLIB -DHAVE_BZLIB -fomit-frame-pointer -O2 -DFTYPE=float -Wall -Wsign-compare -Wpointer-arith -pedantic -DHAVE_PGPLOT -I. -DHAVE_FFTW -o analyse_image.o analyse_image.cpp In file included from analyse_image.cpp:21: Tools.h:16:15: warning: anonymous variadic macros were introduced in C99 analyse_image.cpp: In function ‘int main(int, char**)’: analyse_image.cpp:114: error: ‘strcmp’ was not declared in this scope analyse_image.cpp:205: error: ‘exit’ was not declared in this scope analyse_image.cpp:209: error: ‘strstr’ was not declared in this scope analyse_image.cpp:216: error: ‘exit’ was not declared in this scope analyse_image.cpp:457: error: ‘strlen’ was not declared in this scope make: *** [analyse_image.o] Error 1

専門家に質問してみよう