오브젝트 파일을 실행파일로 만들때(링크과정인가요?)
gcc -o hello hello.o
로 해보세요.
-D_GNU_SOURCE 부분은 현재 작성한 소스가 GNU_SOURCE 스타일이라는것
이외에는 별다른 의미가 없는 것 같네요.
가령 현재 작성한 코드를 딴 곳에서 컴파일한다면 -D_GNU_SOURCE 부분이
없애야 겠죠. 또 컴파일러가 딴것을 썼을 경우에도 마찬가지입니다.
컴파일 할때 기본 define이 되어 들어가는게 몇가지가 있다고 합니다.
보통 -D 라고 쓰는것은 #ifdef .. #endif 에서 사용하게 됩니다.
보통 소스 내에서
#define MAX 10
또는
#define MAX
라는 것을 컴파일 단계에서 명시하는 것으로 보면 되죠.
저는 종종 작성한 코드가 제대로 돌아가는지 확인하기 위해서 각 단계별로
출력시킬 필요가 printf문을 쓰는 경우가 있는데, 이때 #ifdef를 이용하면
테스트용 프로그램을 작성하기 편할때가 있습니다.
소스에 다음과 같이 적습니다.
// test.c 소스
int main()
{
printf("Hello world");
#ifdef __chan_test
printf("여기까지 제대로 출력이 된건가요?");
#endif
exit(0);
}
컴파일 할때는 다음과 같이 합니다.
gcc -Wall -g -D__chan_test -o test test.c
-D__chan_test 옵션(?)을 했기 때문에 마치 소스에서 #define __chan_test
한 효과가 생기게 되겠죠.
위에 쓴 내용이 정상적으로 돌아간다면,
Hello world
여기까지 제대로 출력이 된건가요?
위와 같은 결과가 나옵니다.
만약 테스트해서 별다른 이상 없이 잘 돌아간다면 다음과 같이 컴파일을 다시
합니다.
gcc -o test test.c
(디버그등 별다른거 볼 필요없이 그냥 컴파일하기로 합니다. 이미 검증은
끝났다고 가정하고서.. )
이 프로그램은 다음과 같이 출력됩니다.
Hello world
소스 자체 변경 없이 최종 실행파일을 조절할 수가 있죠.
...
그냥 이름만 쓴다면 현재 PATH에 잡힌 경로에서만 찾습니다.
(이 부분이 도스나 윈도와 다르군요.)
편하게 쓰려고 PATH에다가 현재 경로를 의미하는 . (쩜)을 추가할 수 있긴
하지만 대부분 그렇게 하는 것보다는 프로그램 실행을 ./hello와 같이
하기를 권하더군요.
: gcc를 처음 배우는 초보입니다.
: 이틀전부터 시작했어요..^^;;
:
: hello.c----------------------------
: #include <stdio.h>
: int main(int argc,char **argv) {
:
: (void) argc;
: (void) argv;
:
: puts("hello");
: return 0;
: }
: -----------------------------------
:
: 컴파일 명령-------------------------
: # gcc -c -Wall -D_GNU_SOURCE hello.c -o hello.o
: # gcc -c hello.o -o hello
: gcc: hello.o: linker input file unused since linking not done
: -----------------------------------
:
: 오브젝트 파일까지는 잘 만들어지는데...
: 왜 링크를하면 저런메세지가 뜨는거죠?
: -D_GNU_SOURCE의 의미는뭔가요?
: 또 위와같이 안하고
: 그냥 gcc hello.c -o hello하면 실행파일은 잘 만들어지는데...
: 꼭 ./hello를 해야 실행이되구..
: 그냥 hello 하면실행이 안되구 말이죠.
:
: 아 그리구 gcc에 관해 질문할만한사이트 있음소개좀해주세요~~
: 읽어주셔서 감사합니다.
:
: --
: 리플달아주신분 감사요~~~ ~(-.-)~