Связывание с внешним объектным файлом (.o) с помощью autoconf - PullRequest
0 голосов
/ 06 марта 2019

В рабочих целях мне нужно связать объектный файл, сгенерированный другой программой и найденный в ее папке, дело в том, что я не нашел информации об этом виде связи.Я думаю, что если я жестко закодирую пути и помещу name-of-obj.o перед переменной package_LDADD, это должно сработать, но дело в том, что я не хочу делать это таким образом.

Если объектне найден. Я хочу, чтобы конфигурация завершилась неудачно и сообщила пользователю, что name-of-obj.o отсутствует.

Я попытался с помощью AC_LIBOBJ([name-of-obj.o]), но попытался найти в корневом каталоге имя-obj.c и скомпилировать его.

Любой совет или решение по этому вопросу?

Спасибо!

1 Ответ

2 голосов
/ 06 марта 2019

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

То, что вы описываете, является очень необычным требованием, не относящимся к тем, для которых Autotools предназначены дляобращаться чисто или легко.В частности, Autoconf не имеет механизмов, специально применимых для поиска пустых объектных файлов, в отличие от библиотек, а Automake не имеет никакой конкретной автоматизации для включения таких объектов при связывании.Тем не менее, эти инструменты имеют достаточно функциональности общего назначения, чтобы делать то, что вы хотите;это просто не будет так аккуратно, как хотелось бы.

Я думаю, что если я жестко закодирую пути и поставлю name-of-obj.o перед переменной package_LDADD, это должно сработать, но случайв том, что я не хочу делать это таким образом.

Я так понимаю, это та часть, которая «жестко закодировала пути», которую вы хотите избежать.Добавление элемента в соответствующую переменную LDADD не подлежит обсуждению;это правильный способ включить ваш объект в ссылку.

Если объект не найден, я хочу, чтобы конфигурация завершилась неудачно и сообщила пользователю, что имя-obj.o отсутствует.

Итак, ключевым моментом является получение configure для поиска вашего объектного файла.Autoconf не имеет встроенного механизма для выполнения такого поиска, но это просто генератор сценариев оболочки на основе макросов, так что вы можете написать такой поиск в сценарии оболочки + Autoconf, возможно, что-то вроде этого:

AC_MSG_CHECKING([for name-of-obj.o])
OTHER_LOCATION=
for my_dir in
    /some/location/other_program/src
    /another/location/other_program.12345/src
    $srcdir/../relative/location/other_program/src; do
  AS_IF([test -r "${my_dir}/name-of-obj.o"], [
    # optionally, perform any desired test to check that the object is usable
    # ... perhaps one using AC_LINK_IFELSE ...
    # if it passes, then
    OTHER_LOCATION=${my_dir}
    break
  ])
done

# Check whether the object was in fact discovered, and act appropriately
AS_IF([test "x${OTHER_LOCATION}" = x], [
  # Not found
  AC_MSG_RESULT([not found])
  AC_MSG_ERROR([Cannot configure without name-of-obj.o])
], [
  AC_MSG_RESULT([${OTHER_LOCATION}/name-of-obj.o])
  AC_SUBST([OTHER_LOCATION])
])

Это функционально, но, конечно, вы можете украсить, например, предоставив сборщику пакетов возможность указать местоположение для использования через аргумент командной строки (AC_ARG_WITH(...)).И если вы хотите сделать это для нескольких объектов, то вам, вероятно, захочется обернуть хотя бы часть из этого в пользовательский макрос.

Сторона Automake гораздо менее сложна.Чтобы связать объект, вам просто нужно добавить его в соответствующую переменную LDADD, используя выходную переменную, созданную выше, например:

foo_LDADD = $(OTHER_LOCATION)/name-of-obj.o

Обратите внимание, что если вы строите только одинЗатем запрограммируйте цель, вместо foo_LDADD можно использовать общий LDADD, но обратите внимание, что по умолчанию это альтернативы, а не дополнения.


С учетом вышесказанного, это в целом плохая идея.Если вы хотите связать что-то, что не является частью вашего проекта, вы должны получить это из установленной библиотеки.Конечно, это может быть локальная, специально созданная библиотека, если она является библиотекой, а не пустым объектным файлом, и она установлена.Это может быть статическая библиотека, если вы не хотите полагаться на отдельную разделяемую библиотеку или распространять ее.

С другой стороны, если ваш проект является частью более крупной сборки, то, вероятно, лучшим подходом являетсяинтегрировать его в эту сборку, возможно, в качестве подпроекта.Лучше было бы связать библиотеку, а не пустой объектный файл, но в контексте подпроекта может иметь смысл использовать библиотеку, которая не была установлена ​​в систему сборки.В сочетании с аргументом командной строки, который сообщает ему, где найти требуемую библиотеку, это может сделать необходимый код Autoconf намного чище и яснее.

...