Я пытаюсь связать тонкий архив, который объединяет две библиотеки архивов в программу на языке 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");
}
Я использую 64-разрядную версию gcc, найденную в macport (gcc46). Я не использую стандартный компилятор Apple, поскольку он не поставляется с gfortran. В настоящее время я устанавливаю gcc46 + univerisal. Я считаю, что тонкому архиву не нравится 64-разрядная арка. – Eldila
Я предлагаю вам использовать команду «файл» для проверки каждого объектного файла и вы извлекаете из библиотеки все объектные файлы и проверяете их. Это должно дать некоторые указания о том, какие шаги ошибочны. –