2016-05-14 3 views
1

Я пытаюсь сгенерировать библиотеку C++ с помощью компилятора g ++. В моей библиотеке есть другая библиотека C как зависимость, и я скомпилировал ее для получения .so-файлов.g ++ не найти .so файлы

I имеют следующую структуру:

src: 
    include/linux: 
     libcustom.a 
     libcustom.la 
     libcustom.so 
     libcustom.so.0 
     libcustom.so.0.0.0 

Теперь, когда у меня есть все .o файлы моих классов CPP, и я хочу связать библиотеку, я выполнить следующую команду:

g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o mylibrary.so File1.o File2.o File3.o -L./include/linux -lc++ -lutil -lm -lcustom -Wl,-rpath='$ORIGIN/include/linux' -L/usr/lib/R/lib -lR 

Но он бросает мне ошибку:

libcustom.so.0: cannot open shared object file: No such file or directory 

Я уверен, выполнение команды из src каталог.

Я знаю, что это может быть исправлено редактирование LD_LIBRARY_PATH, но идея, что это кто-то, может использовать мою библиотеку без необходимости чего-либо настраивать, поэтому я пытаюсь сделать это с флагом -rpath C++.

Любая идея, как я могу ее исправить, или причина ошибки?

+0

используется относительный путь '-Wl, -rpath =./Включать/linux', который не распознается загрузчик 'ld' в Linux. Вместо этого используйте абсолютный путь. Для правильного использования относительного пути, goto http://stackoverflow.com/a/4018559/6238076 – gdlmx

ответ

2

Сообщение об ошибке, которое вы получили, похоже, связано с загрузчиком ld.so вместо компоновщика ld (Я знаю, что имена в замешательстве). Вы должны различать то, что находите это в момент ссылки и во время выполнения. Флаг -L, который вы даете во время ссылки, не имеет ничего общего с локализацией библиотеки во время выполнения.

Неверное значение вашего rpath=./include/linux, так как dot не признано ld как относительный путь. Относительный путь поиска следует, как

-Wl,-rpath='$ORIGIN/include/linux' 

где $ORIGIN представляет папку, в которой ваш исполняемый (не mylibrary.so) определяет местоположение. Обязательно используйте одинарную цитату, а не двойную цитату, потому что строка $ORIGIN должна быть передана компоновщику буквально и жестко закодирована в исполняемый файл.

Подробнее идет

  1. how to link to shared lib from shared lib with relative path

  2. ld: Using -rpath,$ORIGIN inside a shared library (recursive)

+0

Вы совершенно правы, это проблема, потому что теперь я тестировал изменение -rpath, указывающий абсолютный путь библиотеки и это работает. Но '$ ORIGIN' не работает для меня, потому что я использую файл Makevars, и он« переводит »-rpath из' -Wl, -rpath = '' $$ ORIGIN/include/linux '' 'to' -Wl, -rpath = " '/ включить/Linux'" '. Я прочитал веб-страницу, прикрепленную к сообщению, которое вы предлагаете, и я не могу найти решение. Знаете ли вы, как я могу это исправить?Большое спасибо –

+1

В Makefile вам нужно избежать символа '' 'с' $$ ': это' -rpath = '$$ ORIGIN/include/linux'' – gdlmx

+1

Также вам не нужно дважды указывать путь , используйте только одну кавычку. Проверьте эхо вашей команды make и убедитесь, что параметр правильно передан в g ++. – gdlmx