gcc 3.2에서 stl쓰기?

MackTheKnife의 이미지

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에서 어떤걸로 해야되나여?

mykldp의 이미지

typedef basic_string<unsigned char> USTRING; 라고 선언하더라도 실제로 USTRING 을 사용할 수는 없을겁니다. std::char_traits<unsigned char> 를 템플릿 특화로 구현해주셔야 하고 상황에 따라서는 iostream 과 관련된 연산자등도 구현해 주셔야 USTRING 을 사용할 수 있을겁니다. 모듈 컴파일시에는 문제가 없을테지만 실행 파일을 만들기 위해 링크하면 이 녀석들이 구현되어 있지 않아 링크 에러가 납니다. 대부분의 컴파일러가 basic_string<char>, basic_string<wchar_t> 정도만 구현해 놓은 것으로 알고 있습니다. 그런데 gcc 2.96 에서는 이게 링크에러를 내지 않았었나요? ...제 생각에는 에러가 났을 것 같은데..

MackTheKnife의 이미지

2.96에선 컴파일한것을 3.2버젼에서 그대로 사용하여도 문제가 없을까여?
2.96의 stl과 3.2의 stl이 차이가 좀 나는것 같군여..

eek의 이미지

STL을 사용하면 -D_REENTRANT 오브젝 생성시에도 모두 하셔야합니다.

^^

Perl 만세~~~

cdpark의 이미지

MackTheKnife wrote:
2.96에선 컴파일한것을 3.2버젼에서 그대로 사용하여도 문제가 없을까여?
2.96의 stl과 3.2의 stl이 차이가 좀 나는것 같군여..

gcc 2.9x, gcc 3.0, gcc 3.2 사이에 ABI가 바뀌었습니다. C object라면 몰라도 C++ object간의 호환성은 없습니다. 하물며 STL을 사용한 경우라면...

MackTheKnife의 이미지

mykldp wrote:
typedef basic_string<unsigned char> USTRING; 라고 선언하더라도 실제로 USTRING 을 사용할 수는 없을겁니다. std::char_traits<unsigned char> 를 템플릿 특화로 구현해주셔야 하고 상황에 따라서는 iostream 과 관련된 연산자등도 구현해 주셔야 USTRING 을 사용할 수 있을겁니다. 모듈 컴파일시에는 문제가 없을테지만 실행 파일을 만들기 위해 링크하면 이 녀석들이 구현되어 있지 않아 링크 에러가 납니다. 대부분의 컴파일러가 basic_string<char>, basic_string<wchar_t> 정도만 구현해 놓은 것으로 알고 있습니다. 그런데 gcc 2.96 에서는 이게 링크에러를 내지 않았었나요? ...제 생각에는 에러가 났을 것 같은데..

말씀하신대로 char_traits<unsigned char> 만 구현하니까 되는군여..
몇군데 안고치고 했읍니다.
2.96과 3.2대의 stl 이 많이 다르군여.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.