2017-10-09 20 views
-1

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_PATHLIBRARY_PATHを設定することにより、clangコマンドを実行しようとしましたndまた、「追加のライブラリパス」スイッチ-LLDFLAGS)で指定しました。 このすべては時間リンカコマンド"/usr/bin/ld"実行によって無視されているようだが、それは問題ではありません、リンカコマンド自体は、その引数でこれを持っているので:

... -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu ... 

...と、このパスはありません実際には/usr/lib/x86_64-linux-gnureadlink -fと表示されています)に拡大されています。これはlibobjc.so.*です。しかし、リンカコマンドは失敗しますか?

だから私の2番目の質問は次のとおりです。

  • なぜそれが配置されている/usr/lib/x86_64-linux-gnu-Lを経由して、コマンドラインの引数に指定されている場合でも、libobjc.so.*ld見つからない - と私は何をすべきかが必要です、このプログラムをリンクさせるには?
+0

私は間違いなくはない」ため、多くの理由のため、この質問のためのclosevoteを期待できる...

$ ./main Hello, my name is Brad Cox! Hello, my name is Tom Love! 

まあを、素敵なことがソート持っている:私はmainと呼ばれる実行可能ファイルを取得し、それが正常に動作しますオフトピック"?誰かがどのように話題から外れているのかを説明することはできますか?代わりに投稿することはできますか? – sdaau

答えて

0

まあ、連結段階がシンボリックリンクで解決することができる判明。私が最初にldでテストしてみました、と最初は私がなっていた。

$ ld -L/usr/lib/x86_64-linux-gnu -lobjc 
ld: cannot find -lobjc 

...しかし、明示的なパスで、その後、ldはもう「見つけることができない」文句はありません:

$ ld -v /usr/lib/x86_64-linux-gnu/libobjc.so.4 
GNU ld (GNU Binutils for Ubuntu) 2.24 
ld: warning: cannot find entry symbol _start; not setting start address 
私はより密接にディレクトリを見たときに

だから、:結局のところ...

$ (cd /usr/lib/x86_64-linux-gnu; ls libobjc*) 
libobjc_gc.so.4 libobjc_gc.so.4.0.0 libobjc.so.4 libobjc.so.4.0.0 

、単にlibobjc.soと呼ばれるファイルはありません - 彼らはすべてののような名前を持っています...私は思ったので、多分私はlibobjc.soの名前でシンボリックリンク多分必要があります:私はmakeを実行したときに

cd /usr/lib/x86_64-linux-gnu/ 
sudo ln -s libobjc.so.4.0.0 libobjc.so 

...そして今 - それは実際に成功しました!

関連する問題