C++ статически связанная общая библиотека
у меня есть общая библиотека, используемая другим приложением вне моего контроля, которое требует *.Итак, возражения. Моя библиотека использует sqlite3, который должен быть статически связан с ним (мне абсолютно нужен автономный двоичный файл).
когда я пытаюсь скомпилировать и связать свою библиотеку:
-fpic -flto -pthread -m64
-flto -static -shared
Я заканчиваю со следующей ошибкой:
/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
что это перекомпилировать с-fPIC связано? Мой код или ЭЛТ?
Я уже пытался скомпилируйте мой объект с помощью-fPIC с тем же результатом.
спасибо.
EDIT:
проблема, похоже, не связана с SQLite3.
Я написал простую однострочную библиотеку, которая компилируется и связывается следующим образом:
g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
но не такой:
g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
проблема, похоже, связана с CRT (crtbeginT.о.) Я должен перекомпилировать GCC-с-pic или что-то еще?
3 ответов
вы не должны использовать -static
флаг при создании общей библиотеки он предназначен для создания статически связанных исполняемых файлов.
если у вас есть только статическая версия библиотеки, вы можете просто связать ее с помощью -lsqlite3
. Но если есть динамическая версия(.Итак) и статическая версия, компоновщик предпочтет динамическую.
чтобы поручить компоновщику выбрать статический, дайте компоновщику -Bstatic
флаг, и сделать его переключиться обратно на динамическую связь для других материал (например, libc и поддержка динамической среды выполнения) с -Bdynamic
. То есть, вы используете флаги:
-Wl,-Bstatic -lsqlite3 -Wl,-Bdynamic
альтернативно, вы можете просто указать полный путь .файл, например,/usr/lib/libsqlite3.a
вместо флагов компилятора/компоновщика.
С GNU ld вы также можете использовать -l:libsqlite3.a
вместо -lsqlite3
. Это заставит использовать файл библиотеки libsqlite3.a
вместо libsqlite3.so
, который компоновщик предпочитает по умолчанию.
не забудьте убедиться, что .файл был скомпилировано с помощью -fpic
флаг, иначе вы обычно не можете встроить его в общую библиотеку.
любой код, который каким-то образом попадет в динамическую библиотеку, должен быть перемещаем. Это значит, что все, что связано с вашим .таким образом, независимо от того, статически или динамически, должны быть скомпилированы с -fPIC
. В частности, статический!--1--> библиотека также должна быть скомпилирована с -fPIC
.
подробности того, что означает PIC здесь:http://en.wikipedia.org/wiki/Position-independent_code
У меня была та же проблема. Видимо -статическое, не совпадает -Bstatic. Я переключился на-Bstatic, и все сработало.