Как создать статическую и общую библиотеку с помощью автоинструментов?

Я учусь использовать Autotools. Я пишу свою первую программу с помощью этих инструментов, но у меня есть проблема. Я пытаюсь сделать программу, которая использует две библиотеки: одну статическую и одну общую. Я настроил Makefile.am и configure.ac, но не знаю, такие ли они должны быть. Когда я запускаю команду make, она возвращает ошибку:

code.c:37: undefined reference to `function1'.

Выдает такую ​​ошибку для каждой функции. Кажется, что программа не может найти заголовки или исходные файлы?

Все мои файлы находятся в одной папке.

настроить.ac

AC_PREREQ([2.69])
AC_INIT([code], [1.0])
LT_INIT
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([code.c])
AC_CONFIG_MACRO_DIRS([m4])
AC_PROG_CC 
AC_CHECK_HEADERS([stdio.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am

ACLOCAL_AMFLAGS = -I m4

bin_PROGRAMS = code
code_SOURCES = code.c libcodes.la libcode.a libo.h libp.h

lib_LIBRARIES = libcode.a
libcode_a_SOURCES = functionsp.c

code_DEPENDENCIES = libcodes.la
lib_LTLIBRARIES = libcodes.la
libcodes_la_SOURCES = functionso.c
libcodes_la_LDFLAGS = -version-info 1:0:0
code_LDFLAGS = -rpath /usr/local/lib

person crocodile2221    schedule 20.05.2021    source источник


Ответы (1)


Кажется, что программа не может найти заголовки или исходные файлы?

Нет, неопределенная ссылка — это ошибка ссылки. Это означает, что компоновщик пытается разрешить вызов функции, но не видит никакой реализации функции. Обычно это указывает на проблему с библиотеками, указанными в командной строке ссылки.

И действительно, все настройки, связанные со ссылками, в вашем Makefile.am неверны, и есть и другие, менее важные проблемы.

Во-первых, библиотеки, необходимые для компоновки программы, но не расположенные через configure, должны быть указаны в Makefile.am через переменную LDADD или специфичную для программы переменную foo_LDADD. Переменная foo_DEPENDENCIES не служит этой цели — ее содержимое появляется в сгенерированном make-файле как зависимости целевой программы, но больше нигде. В частности, они не включены в командную строку ссылки. На практике переменные foo_DEPENDENCIES используются редко.

Библиотеки особо не следует указывать в качестве источников программ. Они не являются источниками, и указание их как таковых не имеет никакого полезного эффекта.

Говоря о библиотеках, жесткое кодирование предполагаемого каталога установки библиотеки в ваш Makefile.am является плохим тоном и настраивает вас на проблемы, поскольку этот каталог может быть указан пользователем в configure и/или make времени. К счастью, у каждого настраиваемого каталога установки есть соответствующая переменная, на которую вы можете ссылаться. В случае lib это libdir.

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

В целом, вы, вероятно, хотите что-то более похожее на это:

ACLOCAL_AMFLAGS = -I m4

bin_PROGRAMS = code
lib_LIBRARIES = libcode.a
lib_LTLIBRARIES = libcodes.la

code_SOURCES = code.c libo.h libp.h
code_LDFLAGS = -rpath $(libdir)
code_LDADD = libcodes.la libcode.a
# or LDADD = libcodes.la libcode.a

libcode_a_SOURCES = functionsp.c

libcodes_la_SOURCES = functionso.c
libcodes_la_LDFLAGS = -version-info 1:0:0
person John Bollinger    schedule 20.05.2021
comment
Оно работает! Спасибо за помощь и много полезной информации. - person crocodile2221; 21.05.2021
comment
Рад помочь, @crocodile2221. Обычно, когда на их вопрос получен удовлетворительный ответ, ОП принимает один из ответов, щелкнув галочку рядом с его оценкой. - person John Bollinger; 22.05.2021
comment
Ой ну спасибо. Я не знал об этом, но уже сделал это. - person crocodile2221; 22.05.2021