gcc 3.2에서 stl쓰기?
글쓴이: MackTheKnife / 작성시간: 일, 2004/01/25 - 1:23오전
stl을 이용해서 프로그램을 짯는데
gcc 2.96에서는 별문제 없는게 3.2에서는 문제가 많네여
unsigned char타입의 String class가 필요해서 담과 같이 정의해서 쓰고있읍니다.
typedef basic_string<unsigned char> USTRING;
Object파일을 만들때는 별문제 없던게 실행화일을 만들때 담과 같은 에러가 떨어집니다.
g++ -g -DDEBUG -o TPacket.o -c TPacket.cpp -I../common g++ -g -DDEBUG -o smp.o -c smp.cpp -I../common g++ -g -DDEBUG -o Queue.o -c Queue.cpp -I../common g++ -g -DDEBUG -o sml.o -c sml.cpp -I../common g++ -g -DDEBUG -o sma.o -c sma.cpp -I../common g++ -g -DDEBUG -o monitoring.o -c monitoring.cpp -I../common g++ -g -DDEBUG -D_REENTRANT -D_PTHREADS -o sma TPacket.o smp.o Queue.o sml.o sma.o monitoring.o -lpthread -L../common -lpmsb_return Queue.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::assign(unsigned char const*)': /home/mclee77/PMSB/monitoring/Queue.cpp:6: undefined reference to `std::char_traits<unsigned char>::length(unsigned char const*)' Queue.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::assign(unsigned char const*, unsigned)': /home/mclee77/PMSB/monitoring/Queue.cpp:8: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' /home/mclee77/PMSB/monitoring/Queue.cpp:8: undefined reference to `std::char_traits<unsigned char>::move(unsigned char*, unsigned char const*, unsigned)' Queue.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::_Rep::_M_clone(std::allocator<unsigned char> const&, unsigned)': /home/mclee77/PMSB/monitoring/Queue.cpp:8: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' Queue.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::_M_mutate(unsigned, unsigned, unsigned)': /home/mclee77/PMSB/monitoring/Queue.cpp:8: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' /home/mclee77/PMSB/monitoring/Queue.cpp:8: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' /home/mclee77/PMSB/monitoring/Queue.cpp:23: undefined reference to `std::char_traits<unsigned char>::move(unsigned char*, unsigned char const*, unsigned)' Queue.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::_S_copy_chars(unsigned char*, unsigned char const*, unsigned char const*)': /home/mclee77/PMSB/monitoring/Queue.cpp:6: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' sml.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::basic_string[in-charge](unsigned char const*, std::allocator<unsigned char> const&)': /home/mclee77/PMSB/monitoring/sml.cpp:5: undefined reference to `std::char_traits<unsigned char>::length(unsigned char const*)' sml.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::append(unsigned char const*)': /home/mclee77/PMSB/monitoring/sml.cpp:5: undefined reference to `std::char_traits<unsigned char>::length(unsigned char const*)' sml.o: In function `std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::_S_copy_chars(unsigned char*, unsigned char*, unsigned char*)': /home/mclee77/PMSB/monitoring/sml.cpp:5: undefined reference to `std::char_traits<unsigned char>::copy(unsigned char*, unsigned char const*, unsigned)' collect2: ld returned 1 exit status make: *** [sma] 오류 1
그리구 unsinged char형으로 string 같은 클래스를 구현할려면 stl에서 어떤걸로 해야되나여?
Forums:
안될텐데요..
typedef basic_string<unsigned char> USTRING; 라고 선언하더라도 실제로 USTRING 을 사용할 수는 없을겁니다. std::char_traits<unsigned char> 를 템플릿 특화로 구현해주셔야 하고 상황에 따라서는 iostream 과 관련된 연산자등도 구현해 주셔야 USTRING 을 사용할 수 있을겁니다. 모듈 컴파일시에는 문제가 없을테지만 실행 파일을 만들기 위해 링크하면 이 녀석들이 구현되어 있지 않아 링크 에러가 납니다. 대부분의 컴파일러가 basic_string<char>, basic_string<wchar_t> 정도만 구현해 놓은 것으로 알고 있습니다. 그런데 gcc 2.96 에서는 이게 링크에러를 내지 않았었나요? ...제 생각에는 에러가 났을 것 같은데..
gcc 2.96에선 에러가 나지 않습니다.
2.96에선 컴파일한것을 3.2버젼에서 그대로 사용하여도 문제가 없을까여?
2.96의 stl과 3.2의 stl이 차이가 좀 나는것 같군여..
STL을 사용하면 -D_REENTRANT 디파일을 모두 하셔야합니다.
STL을 사용하면 -D_REENTRANT 오브젝 생성시에도 모두 하셔야합니다.
^^
Perl 만세~~~
Re: gcc 2.96에선 에러가 나지 않습니다.
gcc 2.9x, gcc 3.0, gcc 3.2 사이에 ABI가 바뀌었습니다. C object라면 몰라도 C++ object간의 호환성은 없습니다. 하물며 STL을 사용한 경우라면...
Re: 안될텐데요..
말씀하신대로 char_traits<unsigned char> 만 구현하니까 되는군여..
몇군데 안고치고 했읍니다.
2.96과 3.2대의 stl 이 많이 다르군여.
댓글 달기