*.o를 링크하면 되고 라이브러리를 만들면 안됩니다.
글쓴이: ftfuture / 작성시간: 금, 2009/05/08 - 3:30오후
환경은 SunOS 5.8 입니다. 신기하게도.. 해당 루틴의 오브젝트 파일을 바로 링크하면 되는데
라이브러리를 만들면 링크에러가 납니다.
문제되는 부분만 추출하였습니다.
teststat.* 라이브러리로 만들 루틴입니다. test_test.cc 테스트 프로그램입니다.
teststat.h
#include < string> #include < map> class teststat { public: typedef std::map < std::string, int, std::less< std::string>, std::allocator< std::string> > testmap; testmap test_map; teststat(); ~teststat(); }; // class teststat
teststat.cc
#include < teststat.h> teststat::teststat() { return; } teststat::~teststat() { return; }
test_test.cc
#include < teststat.h> int main(void) { class teststat stat1; }
Makefile
test : CC -c teststat.cc -I. ar rv libtestlib.a teststat.o # CC -o test_test test_test.cc -I. -L. -ltestlib CC -o test_test test_test.cc teststat.o -I.
Error Code
__rwstd::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rwstd::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator __rwstd::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rwstd::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::erase(__rwstd::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rwstd::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,__rwstd::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rwstd::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator) ./libtestlib.a(teststat.o) void __rwstd::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rwstd::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::__deallocate_buffers() ./libtestlib.a(teststat.o)
Forums:
흠..
< code > 로 묶어도 코드가 깨지네요.. 일단 한칸 띄기 신공으로 ㅋㅋ 돌려보실때는 붙여서 해보세요..
라이브러리를 링크할
라이브러리를 링크할 때 -lstl 같은 식이나 -lstdc++ 같은 식(정확한 라이브러리 이름을 몰라서) 해도 안되나요?
음..
아~ 일단 답변 감사드립니다.
object 파일을 바로 링크를 하면 정상동작 되는 걸로 봐서는 필요없는 것 같습니다.
그리고 서드파티 인지 -lrwtool 인가 하는 걸로 링크를 했는데 안되네요..
라이브러리를
라이브러리를 만들때와 실행파일을 만들때는 컴파일러가 자동으로넣어주는 링크옵션이 다릅니다.
오브젝트로 바로 링크할때는 바로 실행파일을 만들기 때문에 자동을 들어가지만 main함수를 제외하고 라이브러리로 만들땐 빠져서 빌드가 안되는 경우가 자주 있습니다.
한번 직접 링크옵션을 줘보세요.
음..
그럴 수도 있겠네요..
답변 감사드립니다..
옵션을 찾아보겠습니다.
혹시 괞찮으시면 예를 들어주시면 감사하겠습니다. ^^
음...
libtestlib.a 는 static library 인데, linker 에는 shared library 로 지정해주셨네요. ??
libtestlib 을 shared library 로 빌드해야, link 옵션이 맞을 것 같은데요.
대충 아래와 같은 식으로 한 번 빌드해 보시면 어찌 되는지..?
* shared object 만드는 명령을 엉뚱한 걸 썼네요.. (수정)
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
안녕하세요..
음.. 어느부분이 shared library로 지정된건가요? 정적으로 저렇게 써도 문제가 없는데요..
-lname
Links with object library libname.so or libname.a (for
ld(1)). The order of libraries in the command line is
important, as symbols are resolved from left to right.
This option must follow the sourcefile.
(libname.so, ㅣlibname.a 의 name부분에 밑줄이 있습니다.. 위에 -l 다음에 오는 name이겠죠.. ^^)
입니다..
음.. 말씀하신대로 해봐도 똑같은 증상이 일어납니다..
음...
static 은 object 와 함께 link 하던 버릇이 있어 착각한 것 같습니다.. ;;;
안쓰는 Sun 장비 하나 있길래 한번 빌드해 봤는데..
shared 로 build 하면 비슷한 에러가 나는데...
static 으로 build 하면 teststat::teststat() 이 undefiend symbol 이 나오는군요.
nm 으로 찍어봐도 해당 symbol 은 안 보입니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
음..
C++ User's Guide 보고 Makefile 수정해 봤는데..
static 의 경우에는 위와 동일하게 method 가 undefined 떨어지고..
shared 의 경우에는 그냥 컴파일 되는군요... ;;
장비는 Sun 5.8 sparc 이고, 컴파일러는.. 무려 Forte6 U2 네요.. ;;;;
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
아 고치신 버젼으로 해봤는데
에러가 나네요..
링크할 때
링크할 때 c++로.
직접 라이브러리 이름을 -lstdc++ 식으로 지정해도 될 텐데 SunOS니 이름이 다를 지도 모르겠군요.
하아~ 자답입니다..
Solaris환경의 Forte6 C++ 컴파일러 입니다.. 그래서 그런지.. ar을 사용해서는 안됩니다..
/opt 폴더를 다 뒤졌더니 html로 된 매뉴얼이 나오더군요..
어쩃든 댓글 달아주신분들 사랑해요 ^^;;
댓글 달기