티스토리 뷰

Application/Linux

cpp파일로 컴파일할 때 주의점

알 수 없는 사용자 2012. 1. 1. 00:56

CPP을 리눅스에서 gcc로 컴파일 하게 되면 아래에서 얘기한것 처럼
undefined reference to `__gxx_personality_v0' 라는 에러가 발생한다.

몇년 전에 같은 문제로 어려움을 겪다가 구글에서 검색해보았더니,
전역변수로 int __gxx_personality_v0 를 선언해주면 된다고 하여 그렇게 사용을 해왔다.

하지만 최근 pthread 프로그램을 하다가 레드헷9.0 에서는 전혀 이상없이 실행이 되는데
페도라 코아 3.x(확실하지 않음) 에서는 segmentation fault 메시지를 출력하며
특정지점에서 프로그램이 죽어버리는 현상이 발생하였다.

이틀동안을 삽질하다가 발견한 이유는 상기 int __gxx_personality_v0 변수 선언 때문이었다.
이 선언을 삭제하니까 이상하게 세그먼트 오류가 전혀 발생하지 않는것이다.
정확한 메카니즘은 잘 모르겠지만 문제가 해결되어 검색을 하다보니 아래와 같은 내용이
있어 스크랩 해둔다.

--------------------------------------------------------------------

* 출처 : http://blog.naver.com/bozlo?Redirect=Log&logNo=40021287817

extern void a_func(void); 
///--> 주의 extern "C"를 사용하지 않는다. main.cpp , a.cpp 모두 같은 cpp 파일이다.


 #include "a.h"
int main(void) 
{ 
    a_func(); 
} 
a.cpp 

#include <stdio.h> 
void a_func(void) 
{ 
    printf("hello world\n"); 
} 

----------------------

gcc -c -o test.out a.cpp main.cpp 를 하면 다음과 같은 에러가 발생한다.

/tmp/ccSBYZq4.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

gcc는 c,와 c++에 대해서 유연하게 대응하지 못한다, 특히 C++에 대해서
따라서, 명시적으로 g++을 이용하거나 libstdc++을 추가하는 방법으로 해야한다.

g++ -c -o test.out a.cpp main.cpp
gcc -c -o test.out a.cpp main.cpp -lstdc++
<주의 .. -Lstdc++ 안됨. L의 소문자  이어야 한다.>