Ich versuche, ein Thin-Archiv zu verknüpfen, das zwei Archivbibliotheken mit einem C-Programm kombiniert.Verknüpfen mit Thin-Archiv auf Snow Leopard
konstruierte ich zwei einfache Welt Funktionen Hallo und ein Archiv mit den Befehlen aufgebaut:
ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o
Die beiden Archive werden dann mit einem Dünn Archiv mit fusionierte:
ar rcsT all_lib.a lib1.a lib2.a
und dann mit gcc kompiliert :
gcc main.o all_lib.a -o hello
Ich am Ende mit einer Fehlermeldung sagen:
ld: Warnung: Datei all_lib.a ignorieren, Datei für nicht unterstützte Dateiformat gebaut wurde, die nicht die Architektur verbunden ist (x86_64)
undefinierte Symbole für Architektur x86_64: „_func1“, verwiesen von: _main in main.o "_func2", verwiesen von: _main in main.o ld: Symbol (e) nicht für die Architektur x86_64 gefunden
Wenn ich mit lib1.a und lib2 zu verknüpfen main.o versuchen. a direkt, alles funktioniert.
Ich benutze gcc (MacPorts gcc46 4.6.3_3) 4.6.3 und GNU ar (GNU Binutils) 2.21 unter 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
mit Standard-Apple-Toolslib1.c
#include "lib1.h"
void func1()
{
printf("Hello World 1\n");
}
lib2.c
#include "lib2.h"
void func2()
{
printf("Hello World 2\n");
}
Ich verwende 64-Bit-Version von gcc in Macport (gcc46) gefunden. Ich verwende nicht den Standard Apple Compiler, da es nicht mit gfortran kommt. Ich installiere gerade gcc46 + univerisal. Ich glaube, dass Thin-Archiv den 64-Bit-Arch nicht mag. – Eldila
Ich empfehle Ihnen, den Befehl "file" zu verwenden, um jede Objektdatei zu untersuchen und alle Objektdateien aus der Bibliothek zu extrahieren und zu untersuchen. Dies sollte einige Hinweise darauf geben, welche Schritte sich falsch verhalten. –