Разделение генерации файла библиотеки общих объектов (.so) на два этапа вместо одного
Я пытаюсь построить общую библиотеку lib_test.so
из 'test.c' & test.exp
файлы. это lib_test.so
файл будет использоваться как расширение для другого приложения. Приложение документирует генерацию tle lib_test.so
файл напрямую за один проход с помощью следующей команды:
`gcc -q64 -o lib_test.so test.c -bM:Sre -bE:test.exp -bnoentry`
Но мое требование состоит в том, чтобы собрать библиотеку в два этапа:
- Скомпилировать для генерации
test.o
использование файлаgcc
команда. - Ссылка для создания библиотеки
lib_test.so
с помощьюld
команда.
Я попробовал это следующим образом:
- Выполнен шаг компиляции следующим образом:
gcc -q64 -c -o test.o test.c
, - Создайте
lib_test.so
следующее:ld -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o
Но это не порождает правильное lib_test.so
файл.
Я использую Ubuntu 16.04 LTS 64-Bit с последней версией GCC
Можете ли вы предложить правильный способ разделить процесс на два этапа...
С уважением.
2 ответа
Большая разница между связью с программой интерфейса GCC gcc
и с фактическим компоновщиком ld
является то, что интерфейс GCC добавляет несколько библиотек, которые будут связаны с. Наиболее заметно библиотека времени выполнения GCC (-lgcc_s
или же -lgcc
) и фактическая стандартная библиотека C (-lc
).
Когда вы вызываете ld
прямо вы не говорите ему, чтобы связать с этими библиотеками.
Также могут быть другие библиотеки и флаги, которые передает интерфейс GCC ld
без вашего ведома. Для сборки "один проход" передайте флаг -v
в gcc
для подробного вывода и посмотреть, какие аргументы, флаги и библиотеки он использует.
Вы редко когда-либо хотите использовать ld
выполнить связывание. Внешний интерфейс gcc лучше устанавливает правильные флаги и т. Д. Итак, используйте gcc
,
т.е. вместо
ld -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o
делать
gcc -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o
на вашем втором шаге.