Сделайте мультиархитектическую статическую библиотеку на 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
Другие вопросы по тегам