Ссылка на тонкий архив на 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", чтобы увидеть, какая архитектура находится в объектных файлах и исполняемых файлах. Для файлов библиотеки вам, возможно, придется извлечь модули и изучить их.

Другие вопросы по тегам