책, Programming in Objective-C 2.0
현재 보고 있는 책입니다.
이것 저것 배우는 것을 좋아하는 성격에 여러 언어들을 사용하다 보니 언어는 비슷하다는 생각을 갖게 되었었습니다.
Objective-C 를 처음 본게 2007년 10월 경, 맥 네이트온 인수인계 받으면서 인데요.
이번에 맥 네이트온을 안정화 시키겠다고 다짐하고 달려들었지만
역시 내공이 모자랐던 것 같은 생각이 들었습니다.
오늘 “Programming in Objective-C 2.0″ 이란 책을 회사 동료가 가지고 있어서
잠시 빌려서 보고 있는데 기존에 알고 있던 것들을 좀 더 체계적으로 설명을 해주고
제대로 쓰는 방법을 알려주는 면이 있어서 재미있게 보고 있습니다.
특히 메모리를 제대로 쓰는 쪽이 관심이 많이가고 먼저 보게 되었습니다.
보면서 맥 네이트온 죽는 문제에 도움이 될 것 같아서 기분 좋게 보고 있습니다.
혹시, 맥 네이트온이 죽지 않게 할 좋은 책 있으면 추천해주시면 고맙겠습니다~ ㅎㅎ;
- 끝 -
“void value not ignored as it ought to be.” – gcc said -
GTEST(Google test framwork)의 ASSERT_* 을 사용하다
“void value not ignored as it ought to be.” 에러를 만났다.
보니 함수의 리턴값이 void 가 아닌곳에서 void 리턴값을 갖는 것을 사용하면 에러가 나는것 같다.
예를들어,
int test()이렇게 하면 컴파일에서 에러가 발생한다.
{
ASSERT_TRUE( true);
}
Q : My compiler complains “void value not ignored as it ought to be.” What does this mean?
A : You’re probably using an ASSERT_*() in a function that doesn’t return void. ASSERT_*() can only be used in void functions.
ASSERT_TRUE() 를 EXPECT_TRUE() 로 바꾸니 에러가 나지 않았다.
ASSERT_*와 EXPECT_* 와 차이점 – 간단히 조건이 틀리면 함수를 종료하냐 계속하냐의 차이다.
Remember, when they fail, ASSERT_* yields a fatal failure and returns from the current function, while EXPECT_* yields a nonfatal failure, allowing the function to continue running. In either case, an assertion failure means its containing test fails.
Cocoa, 디버그 log를 NSLog 대신 만들어 사용하기.
형식있는 로그를 만들기 위해서 다음과 같이 해봤다.
* common.h
...
#define __FILENAME__ (strrchr(__FILE__,'/')+1)
#define NMLog(msg) NSLog(@"%s(%d) - %@", __FILENAME__, __LINE__, msg)
...
* AppController.m
import "commin.h"
...
NMLog(@"XXX");
* NMSession.m
import "commin.h"
...
NMLog( (@"sendPacket : %@", aPacket) );
주의 : NMLog는 인자를 1개 받기 때문에 “()”를 사용해서 @”sendPacket : %@”, aPacket 를 쌌다. 안싸면 arg가 2개라고 NMLog를 찾을 수 없다는 에러를 낸다.
* 출력결과
...
2008-07-25 18:51:14.629 NateOn[2683] AppController.m(966) - XXX
2008-07-25 18:51:15.237 NateOn[2683] NMSession.m(653) -
...
참고 사이트 :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=777
Cocoa, RegexKit Framework ld error in 10.4.11 tiger.
컴파일에서 다음과 같은 에러가 발생하면, RegexKit Framework Source를 받아서 Compile해서 추가하면 에러가 발생하지 않는다.
collect2: ld returned 1 exit status
cd /Users/x/Documents/trunk/NateOn
/Developer/usr/bin/g++-4.0 -o /Users/x/Documents/trunk/NateOn/build/NateOn.build/Debug/NateOn.build/Objects-normal/ppc/NateOn -arch ppc /Developer/Library/PrivateFrameworks/ZeroLink.framework/Versions/A/Resources/libZeroLinkAppStub.a -Wl,-all_load -L/Users/x/Documents/trunk/NateOn/build/Debug -L/Users/x/Documents/trunk/NateOn -L/Users/x/Documents/trunk/NateOn -L/Users/x/Documents/trunk/NateOn -L/Users/x/Documents/trunk/NateOn -L/Users/x/Documents/trunk/NateOn -L/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn/build/Debug -F/Users/x/Documents/trunk/NateOn/.. -F/Users/x/Documents/trunk/NateOn/.. -F/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn/Frameworks -F/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn -F/Users/x/Documents/trunk/NateOn -F/Developer/Local/Frameworks -F/Developer/Local/Frameworks -framework Growl -framework Cocoa -framework WebKit -lcrypto -framework Carbon -framework SystemConfiguration -framework IOKit -framework RegexKit -Wl,-Y,1455 -framework ZeroLink -F/Developer/Library/PrivateFrameworks -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -Wl,-x -Wl,-unexported_symbols_list -Wl,/Developer/Library/PrivateFrameworks/ZeroLink.framework/Versions/A/Resources/ZeroLinkAppStub.nexp -Wl,-sectcreate -Wl,__TEXT -Wl,__zerolink -Wl,/Users/x/Documents/trunk/NateOn/build/NateOn.build/Debug/NateOn.build/Objects-normal/ppc/NateOn.zerolink
/Developer/usr/bin/../libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning -F: directory name (/Users/x/Documents/trunk/NateOn/Frameworks) does not exist
/Developer/usr/bin/../libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: /Developer/Local/Frameworks/RegexKit.framework/RegexKit unknown flags (type) of section 6 (__TEXT,__dof_RegexKit) in load command 0
collect2: ld returned 1 exit status
주의사항
- RegexKit Framework 컴파일은 README.MacOSX를 보고 Terminal에서 컴파일 한다. 소스안의 RegexKit.xcodeproj를 XCode로 컴파일하니 Warnning이 발생했다.
- 개인적으로 MacPort를 사용하고 있어서 Termial에서 compile이 아마 XCode에서의 컴파일과 다르지 않을까? 하는 생각을 한다.
RegexKit 홈페이지 : http://regexkit.sourceforge.net/
dyld: Library not loaded… Reason: image not found
NateOn has exited due to signal 5 (SIGTRAP).
[Session started at 2008-07-08 15:53:39 +0900.]
dyld: Library not loaded: @executable_path/../Frameworks/Growl.framework/Versions/A/Growl
Referenced from: /Users/x/Documents/trunk/NateOn/build/Release/NateOn.app/Contents/MacOS/NateOn
Reason: image not found
좀 어이없는 설정으로 Framework link error에서 헤맨 것 같다.
결론적으로는 아래 그림에서 보이는 “Copy only when installing” 옵션이 켜져 있어서 에러가 발생했었다.
이게 켜져있으면 NateOn.app 디렉토리안에 Frameworks 의 자료들이 Copy가 되지 않는다.
개인적으로 판단하기에는 이 옵션이 기본인지 모르겠지만 컴파일 시간을 조금이라도 줄여보고자 체크가 되있었던것 같다.
Growl과 같이 Dynamic Library를 사용하는 Framework은 이 옵션을 꺼야한다.





leave a comment