[linux, g ++, linking]: библиотека находится в кеше ldconf и ссылках вручную, но не по умолчанию - PullRequest
0 голосов
/ 17 ноября 2009

Это похоже на предыдущий пост: ld не может найти существующую библиотеку Но, насколько мне известно, это не совсем та же ситуация. Следующая команда работает:

$g++  -I../../include/ -lboost_program_options-mt rips-zigzag.cpp

Однако это не так:

$ g++  -I../../include/ rips-zigzag.cpp
/tmp/ccLvW2Rq.o: In function `process_command_line_options
--snip--
undefined reference to `boost::program_options::options_description::m_default_line_length'
--snip--

Библиотека находится в кеше so:

$ ldconfig -p | grep boost_program_options
libboost_program_options-mt.so.1.37.0 (libc6,x86-64) => /usr/lib/libboost_program_options-mt.so.1.37.0
libboost_program_options-mt.so (libc6,x86-64) => /usr/lib/libboost_program_options-mt.so

А вот это из / usr / lib:

akshan@akshan-laptop:~/work/comptop/Dionysus$ ls -l /usr/lib/*program_options*
-rw-r--r-- 1 root root 798686 2009-03-26 19:28 /usr/lib/libboost_program_options-mt.a
lrwxrwxrwx 1 root root     37 2009-10-13 21:09 /usr/lib/libboost_program_options-mt.so -> libboost_program_options-mt.so.1.37.0
-rw-r--r-- 1 root root 299224 2009-03-26 19:28 /usr/lib/libboost_program_options-mt.so.1.37.0

Любая помощь с этим очень ценится. Спасибо, Аравиндом.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

ldconfig связан со связыванием во время выполнения. вы все еще должны указывать библиотеки на этапе компоновки сборки.

edit: oh and btw, ключи -l archive должны появиться после что угодно .cpp:

       The  linker will search an archive only once, at the location where  
       it is specified on the command line.  If the archive defines a sym‐  
       bol  which  was  undefined in some object which appeared before the  
       archive on the command line, the linker will include the  appropri‐  
       ate  file(s)  from the archive.  However, an undefined symbol in an  
       object appearing later on the  command  line  will  not  cause  the
       linker to search the archive again.
0 голосов
/ 17 ноября 2009

ссылка означает, что в программе, в библиотеке которой будет найден символ, это необходимо как для статических, так и для динамических библиотек.

Может быть несколько версий нужной библиотеки, и это то, о чем ld.so, не , связывающее , а загрузка динамических библиотек. Таким образом, динамически связанная программа не должна открывать каждую библиотеку в системе, чтобы найти ее символы, она будет открывать только правильную. Таким образом, загрузчик библиотеки просто ищет имена файлов, чтобы найти нужную библиотеку для загрузки.

Компиляторы также имеют библиотеку по умолчанию, которую не нужно помещать в командную строку, но не так много. Если вы хотите узнать эти значения по умолчанию, просто добавьте -v в командную строку gcc.

...