Как мне скомпилировать и установить отдельный объектный файл с помощью Automake? - PullRequest
1 голос
/ 06 октября 2019

Я хочу собрать и установить объектный файл (crt1.o, файл запуска C) в каталог библиотеки (/usr/lib) с помощью Automake и Autoconf.

Итак, мой первоначальный примердля этого нужно было создать переменную crt_DATA внутри файла Makefile.am и определить специальные цели для создания файла. Однако у этой идеи есть проблема: файл будет установлен в каталог данных, а не в каталог библиотеки.

Затем я попытался добавить crt1.o в раздел lib_LIBRARIES моего Makefile.am исоздание crt1_o_SOURCES. Однако это дало ошибку:

error: 'crt1.o' is not a standard library name

На данный момент я не мог придумать больше возможных способов сделать это.

Как мне скомпилировать и установить отдельный объектный файл, используяAutomake?


Особые требования:

  • crt1.o нельзя встроить в свою собственную общую библиотеку или архив. Это должен быть просто объектный файл. Это предписано компилятором так, поэтому мои руки связаны.

  • Было бы замечательно, если бы этот файл мог быть отслежен и установлен в правильное место, если DESTDIRизменено.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

То, что я в итоге сделал, это:

crtdir = $(libdir)
crt_DATA = crt1.o Scrt1.o crti.o crtn.o

crt1.o: $(top_srcdir)/src/crt/crt1.c
        $(CC) -c -fno-PIC $(AM_CPPFLAGS) $(CFLAGS) -o $@ $^

Scrt1.o: $(top_srcdir)/src/crt/crt1.c
        $(CC) -c -fPIC $(AM_CPPFLAGS) $(CFLAGS) -o $@ $^

crti.o: $(top_srcdir)/arch/$(ARCH)/src/crt/crti.s
        $(CCAS) -c $(CFLAGS) -o $@ $^

crtn.o: $(top_srcdir)/arch/$(ARCH)/src/crt/crtn.s
        $(CCAS) -c $(CFLAGS) -o $@ $^

Конечно, вкладки и пробелы перепутаны, но все же.

Благодарю @EdwinBuck за его ответ, вдохновениедля моего!

1 голос
/ 06 октября 2019

Обычно объектный файл сам по себе бесполезен. Я не могу быть запущен, и его нельзя использовать, кроме как для ссылки на другие объектные файлы для создания программы.

Возможно, вам нужен файл "общего объекта" или файл .so, еслиВы хотите построить библиотеку. Или, если вы хотите статически связать библиотеку, вам может потребоваться «файл библиотеки» или файл .la.

Automake использует Libtool для создания библиотечных файлов обоих типов, но может получитьсложный. Это связано с тем, что эти библиотечные файлы немного различаются на разных платформах, и automake / libtool пытается обработать различия платформ для вас.

Предполагая, что приведенная выше информация не то, что вам нужно, и вы действительно хотите установитьфайла .o, то вам следует добавить следующее к вашему Makefile.am

somethingdir = /path/to/where/you/want/the/file
something_DATA = the_file.o

. При этом объектный файл обрабатывается как файл данных и устанавливается файл данных по выбранному пути.

Опять же, я почти уверен, что это не то, что вам действительно нужно, но, по крайней мере, вы знаете, как установить объектный файл.

Вероятно, вам понадобится:

  1. Сборка объектного файла в исполняемый файл и установка этого исполняемого файла
  2. Сборка объектного файла в общую библиотеку объектови установите эту библиотеку
  3. Создайте объектный файл в архив библиотеки (это файл .la) и установите этот архив библиотеки.

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

...