2012-08-17 6 views
5

Я пытаюсь связать тонкий архив, который объединяет две библиотеки архивов в программу на языке C.Ссылка на тонкий архив на Snow Leopard

я построил две простого привет мира функций и встроенную архив с командами:

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 

В итоге я получаю сообщение об ошибке:

л.д.: предупреждение: игнорирование файла all_lib.a, файл был создан для неподдерживаемый формат файла, который не является архитектура быть связана (x86_64)

неопределенные символы для архитектуры x86_64: «_func1», ссылочные от: именоваться _main в main.o "_func2", ссылочных от: _MAIN в main.o LD: символ (ы) не найдено для архитектуры x86_64

Если я пытаюсь связать main.o с lib1.a и lib2. прямо, все работает.

Я использую 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»?

Вы можете использовать команду «файл», чтобы увидеть, какие архитектуры находятся в объектных файлах и исполняемых файлах. Для файлов библиотеки вам может потребоваться извлечь модули и изучить их.

+0

Я использую 64-разрядную версию gcc, найденную в macport (gcc46). Я не использую стандартный компилятор Apple, поскольку он не поставляется с gfortran. В настоящее время я устанавливаю gcc46 + univerisal. Я считаю, что тонкому архиву не нравится 64-разрядная арка. – Eldila

+0

Я предлагаю вам использовать команду «файл» для проверки каждого объектного файла и вы извлекаете из библиотеки все объектные файлы и проверяете их. Это должно дать некоторые указания о том, какие шаги ошибочны. –

Смежные вопросы