Ответ 1
Вы не указали операционную систему, но допустим, что это относительно новая версия Unix/Linux/OSX. Если это не так, игнорируйте следующее предупреждение.
Прежде чем я отвечу, вы должны знать, что смешивать статический и общий код в большинстве систем на базе ELF (Unix/Linux) проблематично. Одна из причин заключается в том, что это может привести к потере синхронизации в коде, если вы забудете связать обновленную зависимость. Другая причина связана с природой статического кода и PIC. Вот почему libtool пытается отговорить его.
Тем не менее, в Makefile.am (при условии, что ваша последняя программа - foo
, а разделяемая библиотека -):
.
.
.
foo_SOURCES = foo.c abc.c def.c hij.c
foo_LDFLAGS = -all-static -Wl,-Bdynamic,-L/path/to,-lshared,-Bstatic
foo_LDADD = -L../path/to -lbar -lbaz
Здесь важно то, что libtool позволяет вам закорачивать проверки и флаг GNU gcc -static
(который используется libtool) путем передачи аргументов -Wl,
непосредственно компоновщику (GNU ld). Для ввода пробелов между аргументами используется разделитель запятой ,
.
Оба -Bstatic
и -Bdynamic
описаны в GNU ld информационных страницах, а также на экране справки. Опять же, поскольку вы не упомянули используемый пакет os или компилятор, я предполагаю, что GNU gcc и GNU ld в Linux. Вы можете проверить это, используя ld --help
, чтобы убедиться в этом. Если по какой-то причине это не GNU ld, вам нужно будет найти эквивалентные флаги для -Bstatic
и -Bdynamic
, подставив их в случае необходимости.