Mac C Undefined x86_64

このQ&Aのポイント
  • MacOSX LionのIntel Core 2 duoでC言語を学習中です。
  • 自分のMacでLinuxで作成したプログラムを動かそうとすると、Undefined symbols for architecture x86_64というエラーが出ます。
  • FTGLとGLFWのインストールとコンパイルの変更を試しましたが、解決しませんでした。どうすれば解決できるでしょうか?
回答を見る
  • ベストアンサー

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の違いではなく、ダウンロードしたやつのせいとか、僕の置き場所が悪いとか、あるいは別の原因なのでしょうか?レベルの低い質問ですいません。回答お待ちしております。

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

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

i386でもx86_64でも _ftglRenderFont が出てる、ってことは、単にライブラリの指定間違いでは? -L/opt/local/lib でlibftgl.aのある場所の指定もしていないし、-lftglも付いてないようですが。 Macのcc(実体はgcc)では、デフォルトではカーネルにあわせて32bit,64bitのバイナリーを作ります。 特定のアーキテクチャを指定するときは-arch i386, -arch x86_64 を使います。 実行環境とビルド環境が変わらないなら、ただコンパイルすればいいです。 x32とx64を混在するようなら、universalバイナリにするのがよいです。 MacPortsでインストールできるライブラリでは、大抵、variantにuniversalがあるので、 port install XXXX +universal と指定するとよいです。(すでにインストールしてあるものはport upgrade --enforce-variants XXX +universal という感じに、variant適用してのアップグレードを使う) あとは、glfwをどうやってインストールしたかによっては、さらに変更が必要かもしれません

nasanaut
質問者

お礼

ありがとうございます。Linkerをlibftgl.aとつないだら動きました.

関連する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)

  • C++のプログラムについて教えてください。

    C++のプログラムについて教えてください。 以下のようなプログラムでコンパイルを行うと、エラーが起きてしまい、原因が分かりません。 OSはMac OS X 10.6.4です。 プログラム //************************************ //main.cpp #include <iostream> class test{ private: static int num; public: test(); int get_num(); }; test::test(){ num=0; } int test::get_num(){ return num; } int main(){ test t; int num = t.get_num(); std::cout<<num<<std::endl; return (0); } //*********************************** g++ -o main main.cppでコンパイルした結果 Undefined symbols: "test::num", referenced from: test::test() in ccYWvIdB.o test::test() in ccYWvIdB.o test::get_num() in ccYWvIdB.o ld: symbol(s) not found collect2: ld returned 1 exit status のようにエラーが起きます。 どなたか分かる方がいればお願いします。

  • mailを打つアプリを作っているんですけど。

    バグが全然消えずエラー内容見ても何が原因かわかりません。 Undefined symbols for architecture i386: "_OBJC_CLASS_$_MFMailComposeViewController", referenced from: objc-class-ref in InstaEmail.o ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status エラー内容がわかる人すいませんけど教えてください。

  • 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 どなたかこのエラーの解決方法を教えていただけないでしょうか。 お願いします。

  • OpenGLがコンパイルできません。

    OpenGLをコンパイルしようとしてCygwinで 「gcc -o sample (プログラムの名前).c -I/usr/local/include -lglut32 -lglu32 -lopengl32」 と入力すると 「In file included from /usr/include/GL/glut.h:132, from (プログラムの名前).c:1: /usr/include/w32api/GL/glu.h:230: error ハクヒ。・ィ・鬘シ before '*' taken」 と表示されてコンパイルできません。「ハクヒ。・ィ・鬘シ」の部分は文字化けだと思います。このエラーメッセージから何が問題か分かる方がいらっしゃいましたら回答していただけると嬉しいです。CygwinはNetinstallからすべてのものをインストールしたので足りないものはないと思います。よろしくお願いします。

  • コンパイルエラー

    こんにちは。質問させてください。 Ubuntu9.04 64-bitであるプログラムをコンパイルしたところ、次のようなエラーが出ました。 gcc -lm -lz findpat.o bwt.o common.o libp2zip.o lcp.o mrs.o bittree.o tiempos.o enc.o -o findpat /usr/bin/ld: i386 architecture of input file `findpat.o' is incompatible with i386:x86-64 output /usr/bin/ld: i386 architecture of input file `libp2zip.o' is incompatible with i386:x86-64 output /usr/bin/ld: i386 architecture of input file `bittree.o' is incompatible with i386:x86-64 output /usr/bin/ld: i386 architecture of input file `tiempos.o' is incompatible with i386:x86-64 output /usr/bin/ld: i386 architecture of input file `enc.o' is incompatible with i386:x86-64 output collect2: ld returned 1 exit status make: *** [findpat] エラー 1 このエラーを直すにはどうすればよいでしょうか?

  • gfortranによるサブルーチンの実行

    初めて投稿させていただきます。 MacOS X 10.5上でgfortranを使用しているのですが、サブルーチンが実行できなくて困っています。メインプログラム(main.f90)とサブルーチン(fast.f90)を同一フォルダ内に置き、ターミナル上でコマンド $ gfortran main.f90 によってコンパイルを実行したところ、 Undefined symbols: "_fast_", referenced from: _MAIN__ in ccz2x6RV.o _MAIN__ in ccz2x6RV.o ld: symbol(s) not found というメッセージが出てコンパイルが失敗してしまいます。サブルーチンが認識されていないということは分かるのですが、それ以上のことはさっぱり分かりません。ご助力願います。 なお、プログラムの内容は高速フーリエ変換です。また、サブルーチンを用いないプログラムに関しては既に正常に動作することを確認しています。

  • octaveのコンパイルオプション

    MATLABのクローンのoctaveを, C++のライブラリとして利用したいと考えているのですが, コンパイルが上手くいきません. プログラムは以下のような単純なものです. --------- begin of hello.cpp ------------------ #include<iostream> #include<octave/config.h> #include<octave/Matrix.h> int main(){ Matrix m(2,2,1.0); cout<<"hello octave !"<<m; return 0; } --------- end of hello.cpp -------------------- 次のようなコンパイルオプションでコンパイルしています. > g++ -I/usr/include/octave-2.1.35/ -L/usr/lib/octave-2.1.35 \ -loctave -lcruft -loctinterp -lreadline -lcurses -llapack \ -lblas -ldl -lg2c -L/home/pippin/name/.redhat/SOURCES/octave-2.1.35/kpathsea \ -lkpathsea hello.cpp すると,次のようなエラーメッセージを返されます. /tmp/ccuvk2IV.o: In function `main': /tmp/ccuvk2IV.o(/text+0x2c): multiple definition of `main' /usr/lib/gcc-lib/i386-redhat-linux/2.96/libg2c.a(main.o)(.text+0x0): first definition here /usr/bin/ld: Warning: size of symbol `main' changed from 58 to 174 in /tmp/ccuvk2IV.o collect2: ld returned 1 exit status エラーメッセージから解するに,libg2c.aでもmain関数が定義されているため, hello.cppのmain関数とかぶるという様な事だと思うんですが,ライブラリに main関数が定義されているというのも変な話です. ちなみに,コンパイルした環境は, OS: redhat linux 7.3 octave version 2.1.35 gcc version 2.96 このタイプのエラーを回避する方法を知っておられる方は, 回答の方よろしくお願いします.

  • 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」というメッセージから 何かライブラリが足りないのかな?程度しか情報を読み取る事ができませんでした。 以上、よろしくお願いします。

  • Xcodeでのc言語のプログクムについて。

    Xcodeでのc言語のプログクムについて。 ルンゲークッタ法のプログラムを書いているのですがビルドエラーになってしまい、原因が分かりません。  ビルド結果は、 "_func",referenced from: _main in main.o "_dvector",referenced from: _main in main.o _rk4 in main.o symbol(s) not found collect2: ld returned 1 exit status  プログラムは、 #include <stdio.h> #include <stdlib.h> double *dvector(long i, long j); /* ベクトル量領域の確保*/ void free_dvector(double *a, long i); /* 領域の解放*/ double func(double x, double y); /* 関数の定義 */ /* ルンゲークッタ法 */ double *rk4( double y0, double a, double b, int n, double (*f)()); int main (void) { double *y, h, a=0.0, b=1.0, y0=1.0 ; int i, n; printf("分割式を入力してください-->"); scanf("%d",&n); y = dvector( 0, n ); /*領域の確保*/ y = rk4( y0, a, b, n, func ); /*ルンゲクッタ法*/ /* 結果の表示 */ h = (b-a)/n ; /* 刻み幅 */ for (i = 0 ; i <= n ; i++) { printf("x=%f \t y=%f \n", a+i*h, y[i] ); } return 0; } /* ルンゲクッタ法 */ double *rk4( double y0, double a, double b, int n, double (*f)() ) { double k1, k2, k3, k4, h, *y, x; int i; y = dvector( 0, n ); /* y[0,1,....,n]の確保 */ h = (b-a)/n ; /* 初期値の設定 */ y[0] = y0; x = a; /* ルンゲクッタ法 */ for ( i = 0 ; i < n ; i++) { k1 = f(x,y[i]); k2 = f(x+h/2.0, y[i]+h*k1/2.0); k3 = f(x+h/2.0, y[i]+h*k2/2.0); k4 = f(x+h, y[i]+h*k3); y[i+1] = y[i] + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 ); x += y[i]; } return y; free_dvector(y, 0); /* 領域の解放 */ }

専門家に質問してみよう