Objective-Cがどのように動作するかを理解しようとしています。これまで見つかった最も単純な例はhttps://codeseekah.com/2012/09/12/compiling-objective-c-without-a-gui/です。残念ながら、私はそれを実際にコンパイルすることはできません(実際には、リンク)。Ubuntu上でclangを使って単純なObjective-Cの例をビルドする(リンクに失敗する)?
まず第一に、私はUbuntuの14.04(64ビット)を使用し、ここで私がインストールした:
sudo apt-get install clang-3.5 libobjc-4.8-dev
その後、私は、this gistに参照されるページから(わずかに修正)ファイルを持っていますあなたがやるだけのことができます:
cd /tmp
git clone https://gist.github.com/dc0b573ae8ef2424aaeb043a6014b7fd.git testobjc
cd testobjc
make
現在インストールclang-3.5
使用することが変更されMakefile
。
私が持っていた最初の問題があった:
main.m:45:26: error: class method '+new' not found (return type defaults to 'id') [-Werror,-Wobjc-method-access]
Person *brad = [Person new];
私はUnable to compile Objective-C code on Ubuntuが見つかりました:
+(ID)新しいNSObjectクラスの関数です。ただし、ランタイムオブジェクトをサブクラス化しています。 OS Xで使用していたほとんどのAppleメソッドを使用するには、代わりにNSObjectをサブクラス化する必要があります。
GNUランタイムを使用している間もFoundationフレームワークを使用できます。それは利用可能でなければなりません。ここで使用することができます参照があります:死んだリンクで最後が、http://www.cnblogs.com/jack204/archive/2012/03/21/2410095.htmlにコピー
をblog.lyxite.com/2008/01/...:
Objective-CのプログラムをコンパイルしますLinux上で、GNUstepのは
をインストールする必要がありますそれから私はHow to instantiate a class in Objective-C that don't inherit from NSObjectが見つかりました:
あなたは絶対にそうすることができます。あなたのクラスは単にNSObjectのやり方である+ alloc自身を実装する必要があります。ベースでは、malloc()を使用して、クラスのインスタンスを定義する構造体に適合する大きさのメモリを取得することを意味します。
これは、私は取得しないものです:
- をGNUstepのは、GNU/Linux上FoundationのObjective-Cのフレームワークを提供した場合は、
libobjc
の役割は何ですか?!
(init
/alloc
に必要な)これらzoneAlloc
機能等のいずれも上記二つのパッケージのインストールと使用できないので、私はgrep -r " id" //usr/lib/gcc/x86_64-linux-gnu/4.8/include/objc
をした、とid
を返す関数class_createInstance
がある発見し、これによってそれを使用するnew
メソッドを定義すると、コンパイラーはコンパイル・ステップでエラー・メッセージを生成しません。
しかし、その後、それはリンクステップで失敗した - 完全なビルドログは、(make.log
として)要旨でもある - と:
/usr/bin/ld: cannot find -lobjc
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1
まあ、すべての最初の、libobjc.so
はディレクトリ/usr/lib/x86_64-linux-gnu
にあります。 -
$ ls -la /usr/lib/x86_64-linux-gnu/libobjc*
lrwxrwxrwx 1 root root 19 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc_gc.so.4 -> libobjc_gc.so.4.0.0
-rw-r--r-- 1 root root 267552 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc_gc.so.4.0.0
lrwxrwxrwx 1 root root 16 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc.so.4 -> libobjc.so.4.0.0
-rw-r--r-- 1 root root 112536 May 7 2016 /usr/lib/x86_64-linux-gnu/libobjc.so.4.0.0
は...とMakefileで、私は/usr/lib/x86_64-linux-gnu
に両方LD_LIBRARY_PATH
とLIBRARY_PATH
を設定することにより、clang
コマンドを実行しようとしましたndまた、「追加のライブラリパス」スイッチ-L
(LDFLAGS
)で指定しました。 このすべては時間リンカコマンド"/usr/bin/ld"
実行によって無視されているようだが、それは問題ではありません、リンカコマンド自体は、その引数でこれを持っているので:
... -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu ...
...と、このパスはありません実際には/usr/lib/x86_64-linux-gnu
(readlink -f
と表示されています)に拡大されています。これはlibobjc.so.*
です。しかし、リンカコマンドは失敗しますか?
だから私の2番目の質問は次のとおりです。
- なぜそれが配置されている
/usr/lib/x86_64-linux-gnu
が-L
を経由して、コマンドラインの引数に指定されている場合でも、libobjc.so.*
をld
見つからない - と私は何をすべきかが必要です、このプログラムをリンクさせるには?
私は間違いなくはない」ため、多くの理由のため、この質問のためのclosevoteを期待できる...
まあを、素敵なことがソート持っている:私は
main
と呼ばれる実行可能ファイルを取得し、それが正常に動作しますオフトピック"?誰かがどのように話題から外れているのかを説明することはできますか?代わりに投稿することはできますか? – sdaau