gcc 버전이 다르니 컴파일이 되다 안되다 하네요
글쓴이: qman / 작성시간: 금, 2003/08/08 - 10:53오전
레드햇 8.0에서 컴파일하는데 문제가 없던 소스가 레드햇9에서는 안되네요. errno때문이라고 나오는데 왜 이런 차이가 생기는지, 소스를 고치지 않고 해결할 수 있는 방법은 없는지 알려 주시면 감사하겠습니다. 똑같은 소스를 그냥 gcc aaa.c 로 컴파일하는데 레드햇 9에서는 다음과 같은 에러가 발생합니다.
Quote:
/tmp/ccI04A9A.o(.text+0x32): In function `test_start':
: undefined reference to `errno'
collect2: ld returned 1 exit status
헤더파일에 errno.h를 넣어주면 컴파일이 되는데...레드햇 8에서는 없었는데도 컴파일 잘 되던 소스였거든요? 소스 수정 없이 레드햇9에서도 그대로 컴파일하려면 gcc의 설정 어디를 바꿔줘야 하나요....
레드햇 8.0의 gcc 버전은 다음과 같네요.
Quote:
gcc (GCC) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
레드햇 9는
Quote:
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Forums:
아마 link가 제대로 되는 쪽 libc 에서는 errno 가 i
아마 link가 제대로 되는 쪽 libc 에서는 errno 가
int errno;
로 되어있을 것이고,
link가 제대로 되어 있지 않은 곳은
errno 가
#define errno ~~~
이런 식으로 되어 있기 때문일것입니다.
따라서 header를 include하지 않았을 때, C 는 모르는 symbol에 대해서
int 라 가정하여 compile 하게되고,
그것이 우연히(?) libc 안에 있으면 link되는 것이고,
그렇지 않고 다른 이름으로 define 되는 경우라면, link가 제대로 되지 않을 것입니다.
errno.h 를 직접 열어서 확인해보시고
nm /usr/lib/libc.a | grep errno | grep -v " U "
로 확인할 경우 errno에 대한 것이 "D"나 "B"로 나와야 가정에 부합하는 것이 됩니다.
errno.h 를 include 하지 않는 것은, 암묵적인 사용을 유도하는 좋은 프로그램이 아니므로 include 하세요.
-Wall -W
를 사용하여 compile 하시면 warning을 얻을 수 있을 것입니다.
---
http://coolengineer.com
알려주셔서 감사합니다 ^^;;일단 현재 제 상황은...조금 꼼수가
알려주셔서 감사합니다 ^^;;
일단 현재 제 상황은...조금 꼼수가 되더라도 소스는 손을 대지 않고 컴파일 환경 쪽에서 어떻게든 손을 봐서 컴파일이 되게 해야 하는 상황이고요.... T.T
/usr/include/errno.h 를 보니 8.0이나 9나 errno는 모두 extern int 로 선언이 되어 있었습니다.
그리고 nm 수행하는 부분에서도 양쪽다 결과는 같은듯이 보이거든요? 둘다 B로 나오더라구요.
그러면 레드햇8이나 9나 차이가 없는 것 같은데 컴파일은 8에서만 되니....
컴파일 잘 되는 레드햇 8에서 -Wall -W옵션주고 컴파일한 결과는 다음과 같습니다.
레드햇9에서 똑같은 소스를 -Wall -W옵션으로 컴파일한 결과는 다음과 같습니다.
즉 레드햇8에서는 errno쪽은 -Wall -W로 컴파일해도 별 말이 없는데....왜 차이가 나는건지 도통 모르겠네요. 어떻게...소스를 안고치고 해결할 수 있는 방법이 없을까요... 사정상 소스 수정은 거의 불가능하거든요. T.T
gcc option에 -v 로 해서 나오는 결과를 올려 주시겠습니까?
gcc option에 -v 로 해서 나오는 결과를 올려 주시겠습니까?
제가 Redhat9이 없어서.. 약간은 불편하군요.
---
http://coolengineer.com
원래 errno 를 사용할려면...#include <errno.
원래 errno 를 사용할려면...
#include <errno.h> 이놈을 호출하거나...
extern int errno; 이렇게 선언이라도 해줘야 합니다.
이런 선언없이 errno를 사용은 불가능 할텐데?
RedHat 8.0읜 컴파일러에서 된다니?
글쎄요?
코드가 어떤 보드인지는 몰라도 일반적인 코드는 아닐것 같군요...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
errno.h 파일을 부르는 것이 정석입니다. 예전 버젼에선 어느
errno.h 파일을 부르는 것이 정석입니다.
예전 버젼에선 어느 헤더 파일에선가 errno.h 를 불렀겠죠. 새 버젼에선 이게 빠지고요.
지금 문제가 되는 소스에 errno가 다음과 같이 선언은 되어 있습니다.
지금 문제가 되는 소스에 errno가 다음과 같이 선언은 되어 있습니다.
extern int errno;
레드햇9의 gcc -v 실행결과는 다음과 같습니다.
참고로 레드햇 8은 다음과 같네요.
감사합니다....
[quote="qman"]지금 문제가 되는 소스에 errno가 다음과 같
아.. 그냥 command line에서 말고...
Makefile 안에서 -v option을 넣어서 장황하게 보는 것이 좋겠습니다.
P.S.
다른 사람들이 지적하는 것 처럼.. 무리수를 두고 있는 것입다.
단지 include하나 넣는 것이 가장 좋은 해결책임을... 잊지 마시고..
---
http://coolengineer.com
휴....그렇군요.... 여기서 계속 이야기하는 것보다는 errno.h를
휴....그렇군요.... 여기서 계속 이야기하는 것보다는 errno.h를 인클루드하도록 소스를 수정할 수 있는 상황으로 바꾸어 가는 것이 시간적으로 더 이득일것 같네요. :cry:
그렇게 하는건 원래 잘못된 거라고 하니....그냥 제가 삽질좀 하죠뭐.
알려주신 분들 정말 감사드리고요....^^;
복 받으세요~
댓글 달기