Сделайте мультиархитектическую статическую библиотеку на C
Я работаю над Ubuntu и создал статическую библиотеку c, следуя инструкциям на этом сайте.
Но полученный пакет.a работает только на той машине, на которой он был скомпилирован.
Я знаю, что.a архив содержит объектные файлы (только один в моем случае), так что, могу ли я упаковать вместе объектные файлы, скомпилированные на разных машинах (i386 и amd64) таким образом, чтобы GCC мог знать, какой файл следует использовать?
Если я не могу, может, по крайней мере, сделать мою библиотеку узнаваемой на других машинах той же арки?
(с помощью -L. -llibraryname
)
Пример:
имя архива "libvisualt64.a"
команда: gcc -o main main.c -L. -lvisualt64
Говорит:
Пропуск несовместим./libvisualt.a при поиске -lvisualt64 не могу найти -lvisualt64 ошибка: ld вернул 1 состояние выхода
В этом случае я скомпилировал исходный код и собрал архив на той же 64-битной машине только вчера. А вчера все работало нормально. Это происходит и на 32-битных машинах.
1 ответ
Linux использует формат исполняемых файлов, который называется ELF. Файл ELF может содержать только машинный код, необходимый для отдельной архитектуры.
Не должно быть проблем с использованием вашей библиотеки на другом компьютере с той же архитектурой. Единственная потенциальная проблема может быть связана с зависимостями.
Если вы действительно хотите, чтобы один двоичный файл поддерживал несколько архитектур, вас может заинтересовать FatELF... Хотя он не поддерживается без патча для ядра:
До сих пор FatELF не интегрирован в основную линию ядра.
Что касается вашего редактирования, вполне вероятно, что ваш libvisualt64.a
не построен для той же архитектуры, что gcc
нацеливается...
Вам нужно будет извлечь объектные файлы из архива и сравнить их с gcc
цель:
ar xv ${STATIC_LIBRARY}
file *.o
gcc -v 2>&1 | grep '^Target: '
Я вижу следующие (совместимые) выводы:
test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Target: x86_64-linux-gnu