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에 복사 :
가 그럼 난 How to instantiate a class in Objective-C that don't inherit from NSObject 발견 설치해야합니다 : 당신은 절대적으로 그렇게 할 수 있습니다이 목표 - C 프로그램을 컴파일하려면 리눅스에, 그누 스텝은
. 클래스는 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_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.*
입니다. 하지만 여전히 링커 명령이 실패합니다.
그래서 내 두 번째 질문은 다음과 같습니다
- 왜
-L
를 통해libobjc.so.*
, 그것의 명령 줄 인수에 지정된 위치하는 경우에도/usr/lib/x86_64-linux-gnu
을 찾을 수 없습니다ld
않습니다 - 내가 어떻게해야합니까 무엇인지, 이 프로그램을 연결 시키려면?
내가하지만, 확실히 "에 대한, 여러 가지 이유로이 질문에 대한 closevote을 기대할 수 ...
글쎄, 좋은 것을 정렬 가지고 : 나는
main
라는 실행 파일을 얻고, 그것을 잘 실행 주제를 벗어"? 누군가가 이것이 어떻게 주제에서 벗어 났는지 설명 할 수 있습니까? 그리고 Stack Exchange에 그러한 사이트가있는 경우 어디에서 대신 게시 할 수 있습니까?) 감사합니다! – sdaau