Ссылка на тонкий архив на Snow Leopard
Я пытаюсь связать тонкий архив, который объединяет две архивные библиотеки с программой на Си.
Я создал две простые функции hello world и создал архив с помощью команд:
ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o
Затем два архива объединяются с использованием тонкого архива:
ar rcsT all_lib.a lib1.a lib2.a
и затем скомпилирован с GCC:
gcc main.o all_lib.a -o hello
Я получаю сообщение об ошибке:
ld: warning: игнорировать файл all_lib.a, файл создан для неподдерживаемого формата файла, который не связан с архитектурой (x86_64)
Неопределенные символы для архитектуры x86_64: "_func1", ссылка с: _main в main.o "_func2", ссылка с: _main в main.o ld: символы не найдены для архитектуры x86_64
Если я пытаюсь связать main.o с lib1.a и lib2.a напрямую, все работает.
Я использую gcc (MacPorts gcc46 4.6.3_3) 4.6.3 и GNU ar (GNU Binutils) 2.21 на Mac OSX 10.6.8.
Makefile
test1: main.o lib1.o lib2.o
gcc main.o lib1.a lib2.a -o hello
test2: main.o combine
gcc main.o all_lib.a -o hello
lib1.o: lib1.c
gcc -c lib1.c
ar rcs lib1.a lib1.o
lib2.o: lib2.c
gcc -c lib2.c
ar rcs lib2.a lib2.o
combine: lib1.o lib2.o
ar rcsT all_lib.a lib1.a lib2.a
main.o: main.c
gcc -c main.c
clean:
rm -rf *.o *.a hello
main.c
#include<stdio.h>
#include "lib1.h"
#include "lib2.h"
main()
{
printf("Hello World\n");
func1();
func2();
}
lib1.h
#include<stdio.h>
void func1();
lib2.h
#include<stdio.h>
void func2();
lib1.c
#include "lib1.h"
void func1()
{
printf("Hello World 1\n");
}
lib2.c
#include "lib2.h"
void func2()
{
printf("Hello World 2\n");
}
1 ответ
Эти источники и makefile ссылки без жалоб, используя стандартные инструменты Apple. Поддерживают ли используемые вами инструменты ключ "-arch", чтобы вы могли явно указать "-arch x86_64" или "-arch i386"?
Вы можете использовать команду "file", чтобы увидеть, какая архитектура находится в объектных файлах и исполняемых файлах. Для файлов библиотеки вам, возможно, придется извлечь модули и изучить их.