2010-07-28 9 views
15

multiple_sources.cpp을 컴퓨터에서 컴파일하려고합니다. 나는 Xubuntu Lucid Lynx를 완전히 업데이트하고있다.링크 할 때 C++ 라이브러리를 찾을 수 없습니다.`boost :: program_options` 예제를 따르는 오류가 발생했습니다.

그것은 g++ -c multiple_sources.cpp으로 문제없이 컴파일 하겠지만 내가 링크 내가 얻을 g++ multiple_sources.o와 함께 exectuable을하려고하면

multiple_sources.cpp:(.text+0x3d): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x87): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
multiple_sources.cpp:(.text+0x15a): undefined reference to `boost::program_options::options_description::add_options()' 
multiple_sources.cpp:(.text+0x17b): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x193): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x1af): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
multiple_sources.cpp:(.text+0x1eb): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x252): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
... 

등등 광고 nauseum합니다.

내가 라이브러리가 설치되어 수행하십시오 g ++ man 페이지를 읽은 후

>ls -l /usr/lib/libboost_program_options* 
-rw-r--r-- 1 root root 640800 2010-03-31 21:19 /usr/lib/libboost_program_options.a 
lrwxrwxrwx 1 root root  26 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.a  -> libboost_program_options.a 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.so -> libboost_program_options.so.1.40.0 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options.so -> libboost_program_options.so.1.40.0 
-rw-r--r-- 1 root root 289336 2010-03-31 21:19 /usr/lib/libboost_program_options.so.1.40.0 

, 나는 또한 시도 :

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • 모든 위의 그림 중 -L/usr/lib 내가 잘못 뭐하는 거지

    /usr/bin/ld: cannot find -llibboost_program_options.so 
    collect2: ld returned 1 exit status 
    

    : 그들은 모두가 변화와 실패 -l

전에 ?

답변

24

-l param이 잘못되었습니다. lib 사전 수정을 제거하고 -lboost_program_options을 사용하십시오.

링커는 모든 라이브러리가 lib으로 시작하고 라이브러리를 지정할 때이 상태로두기를 기대합니다.

-l (예 : g++ multiple_sources.cpp /usr/lib/libboost_program_options.so)이 아닌 파일 목록에 라이브러리의 전체 경로를 포함 할 수도 있지만 시스템 라이브러리의 경우 규칙을 따를수록 좋습니다. 그들은 항상 /usr/lib에 설치되지는 않습니다.

+2

맞습니다. 혼란스럽게도 링커는 모든 라이브러리가'lib'로 시작하기를 기대하며, 라이브러리를 지정할 때 그 라이브러리를 남겨두기를 바랍니다. –

+0

@Mike 감사합니다! 그게 왜 그런지 물어 보려고했습니다. 이제 이것이 필요합니까? 거기에 대체 할 수있는 것이 있습니까? 나는 지금 호기심에서 물어 본다. – ArtB

+1

@ArtB : 라이브러리의 전체 경로를'-l '이없는 파일 목록에 포함시킬 수도 있습니다 (예 :'g ++ multiple_sources.cpp/usr/lib/libboost_program_options.so'). 그러나 시스템 라이브러리의 경우 규칙을 따르는 것이 좋습니다. 그들은'/ usr/lib'에 항상 설치되는 것은 아닙니다. –

관련 문제