boost и cpp-netlib делают компиляцию ОШИБКА - PullRequest
1 голос
/ 09 мая 2011

[решено] созданы символические ссылки из / usr / lib / lib / * в / usr / lib *

[ОБНОВЛЕНИЕ 3] НОВАЯ ВЕРСИЯ:

Ok,Я думаю, что я что-то исправил

use find / -name "libboost_system.*" outout был

/usr/include/boost/lib/libboost_system.so
/usr/include/boost/lib/libboost_system.a
/usr/include/boost/lib/libboost_system.so.1.46.1
/usr/lib/lib/libboost_system.so
/usr/lib/lib/libboost_system.a
/usr/lib/lib/libboost_system.so.1.46.1
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1
/usr/local/lib/libboost_system.so
/usr/local/lib/libboost_system.a
/usr/local/lib/libboost_system.so.1.46.1
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1

почему эти файлы в /usr/lib/lib?и это проблема?

и ls -l /usr/lib/lib | grep boost_system

ls -l /usr/lib/lib | grep boost_system
-rw-r--r-- 1 root root   21574 2011-05-09 15:15 libboost_system.a
lrwxrwxrwx 1 root root      25 2011-05-09 15:15 libboost_system.so -> libboost_system.so.1.46.1
-rwxr-xr-x 1 root root   20053 2011-05-09 15:15 libboost_system.so.1.46.1

атм мой make-файл выглядит как

LIBPATH=-I/usr/local/include/cpp-netlib 
LIBS=$(LIBPATH) -lboost_system  -lboost_filesystem -lboost_thread -lpthread 

LD=g++ -g 
CPP=g++ -c -g $(LIBS)

P=.
OBJ=$(P)/tmp/main.o $(P)/tmp/CLink.o $(P)/tmp/CFetcher.o

main:   $(OBJ); $(LD) $(OBJ) $(LIBS) -o $@


$(P)/tmp/CLink.o:   $(P)/src/CLink.cpp $(P)/include/CLink.h; $(CPP) -c $< -o $@
$(P)/tmp/CFetcher.o:    $(P)/src/CFetcher.cpp $(P)/include/CFetcher.h; $(CPP) -c $< -o $@
$(P)/tmp/main.o:    $(P)/src/main.cpp $(P)/include/CLink.h $(P)/include/CFetcher.h ; $(CPP) -c $< -o $@

all:
    touch $(P)/tmp/*.o;
    touch main;
    rm -f $(P)/tmp/*.o;
    rm -f main;
    make main;

Вывод компилятора лежит

g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/main.cpp -o tmp/main.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CLink.cpp -o tmp/CLink.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CFetcher.cpp -o tmp/CFetcher.o
g++ -g  ./tmp/main.o ./tmp/CLink.o ./tmp/CFetcher.o -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -o main

Так что для меня все выглядит хорошо, но когда я пытаюсь запустить программу

. / Main

./main: error while loading shared libraries: libboost_system.so.1.46.1: cannot open shared object file: No such file or directory

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Выполните ваше заявление с помощью strace.Это покажет местоположение, где ваше приложение ищет ваших буст-библиотек.В моем случае приложение искал в /usr/lib/x86_64-linux-gnu буст-библиотеки, где фактическое местоположение было /usr/lib/lib.Простой оператор экспорта, добавляющий пути для общих разделяемых библиотек в моем случае LD_LIBRARY_PATH=/usr/lib/lib, сработал.

вывод из strace

open("/usr/lib/x86_64-linux-gnu/libboost_system.so.1.46.1", O_RDONLY) = -1 ENOENT (No such file or directory)
exit_group(127)                         = ?
2 голосов
/ 09 мая 2011
  1. Флаги -l должны прийти после исходных файлов в командной строке компоновщика.

    Да, это означает, что вам придется разделить определение LD на LD и LIBS, поставить все флаги -L и -l в последующем и изменить команду ссылки на:

    $ (LD) $ (OBJ) $ (LIBS) -o $ @

  2. Файлы библиотеки (.so (динамические) или .a (статические)) должны иметь ту же версию, что и заголовки. Хотя в /usr/local/include/boost_1_46_1/ установлены заголовочные файлы boost 1.46.1, соответствующие библиотечные файлы, похоже, не установлены вообще. Единственными установленными библиотеками являются версии 1.40.0 в /usr/lib, поэтому компоновщик находит их (/usr/lib будет найден по умолчанию, даже если вы не включите флаг -L/usr/lib), но они не содержат символов ожидается 1.46.1.

    Обратите внимание, что при связывании с разделяемой библиотекой (настоятельно рекомендуется использовать разделяемые библиотеки в Linux), компоновщик ищет файл с расширением .so, но обычно это символическая ссылка на файл с добавленным суффиксом версии, а компоновщик читает его и записывает имя цели в двоичном файле. Таким образом, программы, скомпилированные для .1.40, продолжат работать после установки 1.46, потому что libboost*.so.1.40.0 может (и должен) остаться после перенаправления .so на версию 1.46.1.

    Должно быть даже возможно установить как:

    /usr/local/lib/boost_1_46_1/libboost_system-mt.so -> /usr/local/lib/libboost_system-mt.so.1.46
    /usr/local/lib/libboost_system-mt.so.1.46 -> /usr/local/lib/libboost_system-mt.so.1.46.1
    /usr/local/lib/libboost_system-mt.so.1.46.1
    

    и скомпилируйте, используя -L/usr/local/lib/boost_1_46_1, хотя в настоящее время я не могу найти ни одного пакета, который бы сделал это, чтобы подтвердить это. Таким образом, вы можете установить файлы разработки для нескольких версий и переключаться между ними, используя явные флаги -I и -L, в то время как динамический компоновщик будет по-прежнему находить файлы времени выполнения, которые он ищет только в /usr/local/lib, /usr/lib и /lib (его можно настроить в /etc/ld.so.conf, но это по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...