Разделение генерации файла библиотеки общих объектов (.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`

Но мое требование состоит в том, чтобы собрать библиотеку в два этапа:

  1. Скомпилировать для генерации test.o использование файла gcc команда.
  2. Ссылка для создания библиотеки lib_test.so с помощью ld команда.

Я попробовал это следующим образом:

  1. Выполнен шаг компиляции следующим образом: gcc -q64 -c -o test.o test.c,
  2. Создайте 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

на вашем втором шаге.

Другие вопросы по тегам