2016-11-18 7 views
-1

У меня есть libSomelib.a, которые могут быть связаны с исполняемым с помощью следующей команды:г ++ связать файл .a и его зависимость в статическом .so

g++ -L. -lsomeLib -lpcrecpp -lpcre -lpthread main.cpp -o main 

Но как я мог бы связать общий объект из него, который содержит все зависимости?

Я хочу, чтобы достичь следующего с моим новым someLib.so:

g++ -L. -lsomeLib main.cpp -o main 

Я попытался следующие:

g++ -shared -L. -lsomeLib -lpcrecpp -lpcre -lpthread -o libSomelib_static.so 

Это дает мне .so файл без каких-либо символов.

PS: Я полностью начинаю компиляторы.

+0

Да, это непростая проблема, но вы просите читателей сделать слишком много, чтобы помочь вам найти решение. Прочитайте [MCVE] (http://stackoverflow.com/help/mcve) и подумайте о том, что вы можете добавить к своему Q, что позволит людям легко копировать/вставлять код и экспериментировать. (Это может быть файл 'libTesta.out', который является только программой« Hello World »с несколькими дополнительными заголовками, ссылающимися на функции в других местах \) Как и все, им приходится все придумывать, правильно? ;-) Удачи. – shellter

+0

Вы пытались использовать ваш .a lib в качестве исходного файла libSomelib.a. то есть g ++ -shared -L. libsomeLib.a -lpcrecpp -lpcre -lpthread -o libSomelib_static.so технически .a файл - это всего лишь коллекция. если это не поможет, хотя вы можете также заглянуть в область видимости https://gcc.gnu.org/wiki/Visibility. То есть скорее всего, компилятор думает, что нет ничего, чтобы экспортировать в библиотеку и уничтожить для вас исключение кода. –

+0

А ... и если вы хотите связать, например, зависимости pthread, вы должны посмотреть на -статический флаг здесь https: // gcc .gnu.org/onlinedocs/gcc/Link-Options.html –

ответ

1

Есть несколько вопросов, в игре здесь:

  1. Linkers использовать только объектные файлы из архива, разрешающих неразрешенные символы. Вот почему порядок архивов в командной строке важен. Правильный порядок - это объектные файлы, за которыми следуют статические библиотеки, за которыми следуют разделяемые библиотеки. Например. g++ -o main -pthread main.cpp -L. -lsomeLib -lpcrecpp -lpcre.
  2. Когда вы создаете общую библиотеку, архив которой не разрешает никаких символов, значит, компоновщик полностью игнорирует его. См. 1.
  3. Файлы объектов для общей библиотеки должны быть скомпилированы как независимый от позиции код (-fPIC флаг компилятора). Архивы обычно строятся без этого флага.
  4. Использовать флаг -pthread при компиляции и связывании многопоточных приложений, а не -lpthread.
+0

(1) не работает, но дает эльф. addig -shared дает пустое .so. Я справился с чем-то вроде: 'g ++ -o libsomeLib.so -pthread -lpcrecpp -lpcre -lc * .o -shared -Wl, -soname, libsomeLib.so' Мне сильно не нравится, что порядок подсчитывается, но вы правы , – deadbeef

+0

Также обратите внимание, что я хотел сделать что-то вроде этого: https://github.com/calebmadrigal/static-shared-lib – deadbeef

+0

@deadbeef Вы можете сделать его более расслабленным относительно заказа за счет скорости ссылки, см. Http: // stackoverflow.com/a/4781964/412080 –

 Смежные вопросы

  • Нет связанных вопросов^_^