2017-10-09 10 views
-1

Objective-C가 어떻게 작동하는지 이해하려고하는데, 지금까지 발견 한 가장 간단한 예제는 https://codeseekah.com/2012/09/12/compiling-objective-c-without-a-gui/입니다. 불행히도, 나는 컴파일 할 수 없다. (사실, 링크). 모든우분투에서 clang을 사용하여 간단한 Objective-C 예제 빌드 (링크 실패)?

첫째, 나는 우분투 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 프레임 워크를 계속 사용할 수 있습니다. 사용할 수 있어야합니다. 여기에 사용할 수있는 기준이있다 : 마지막으로 죽은 링크되어 있는지

을 blog.lyxite.com/2008/01/...하지만 http://www.cnblogs.com/jack204/archive/2012/03/21/2410095.html에 복사 :

이 목표 - C 프로그램을 컴파일하려면 리눅스에, 그누 스텝은

가 그럼 난 How to instantiate a class in Objective-C that don't inherit from NSObject 발견 설치해야합니다 : 당신은 절대적으로 그렇게 할 수 있습니다

. 클래스는 NSObject가하는 방식 인 + alloc 자체를 구현하기 만하면됩니다. base에서 malloc()을 사용하여 클래스의 인스턴스를 정의하는 구조체에 맞게 메모리 덩어리를 잡을 수 있습니다.

그래서 이것은 내가하지 않는 것입니다 :

  • 그누 스텝은 GNU/리눅스 재단의 목적-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에 있습니다 : A -

$ 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 

는 ... 그리고 메이크에, 나는 /usr/lib/x86_64-linux-gnu에 모두 LD_LIBRARY_PATHLIBRARY_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.*입니다. 하지만 여전히 링커 명령이 실패합니다.

그래서 내 두 번째 질문은 다음과 같습니다

  • -L를 통해 libobjc.so.*, 그것의 명령 줄 인수에 지정된 위치하는 경우에도 /usr/lib/x86_64-linux-gnu을 찾을 수 없습니다 ld 않습니다 - 내가 어떻게해야합니까 무엇인지, 이 프로그램을 연결 시키려면?
+0

내가하지만, 확실히 "에 대한, 여러 가지 이유로이 질문에 대한 closevote을 기대할 수 ...

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

글쎄, 좋은 것을 정렬 가지고 : 나는 main라는 실행 파일을 얻고, 그것을 잘 실행 주제를 벗어"? 누군가가 이것이 어떻게 주제에서 벗어 났는지 설명 할 수 있습니까? 그리고 Stack Exchange에 그러한 사이트가있는 경우 어디에서 대신 게시 할 수 있습니까?) 감사합니다! – 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라는 파일이 없으면 -처럼 그들은 모두가 이름 5,486,... 내가 생각 그래서 어쩌면 내가 libobjc.so의 이름으로 심볼릭 링크 어쩌면한다 : 나는 make을 실행할 때

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

... 그리고 지금은 - 실제로 성공!