Estoy intentando vincular un archivo delgado que combina dos bibliotecas de archivos con un programa C.Vinculación al archivo delgado en Snow Leopard
construí dos funciones simples mundo hola y construyeron un archivo con los comandos:
ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o
Los dos archivos son luego se fusionaron mediante una fina-archivo:
ar rcsT all_lib.a lib1.a lib2.a
y luego compilado con gcc :
gcc main.o all_lib.a -o hello
termino con un mensaje de error que dice:
ld: aviso: ignorando all_lib.a archivo, el archivo fue construido para el formato de archivo no compatible que no es la arquitectura está ligada (x86_64)
símbolos no definidos para la arquitectura x86_64: "_func1", se hace referencia a partir de: _MAIN en main.o "_func2", hace referencia a partir de: _main en main.o ld: símbolo (s) no encontrado para la arquitectura x86_64
Si intento vincular main.o con lib1.a y LIB2. a directamente, todo funciona.
Estoy usando gcc (MacPorts gcc46 4.6.3_3) 4.6.3 y GNU ar (GNU Binutils) 2.21 en 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");
}
Estoy usando la versión de 64 bits de gcc que se encuentra en macport (gcc46). No estoy usando el compilador de apple estándar, ya que no viene con gfortran. Actualmente estoy instalando gcc46 + univerisal. Creo que al archivo delgado no le gusta el arco de 64 bits. – Eldila
Sugiero que use el comando "archivo" para examinar cada archivo de objeto y extraer todos los archivos de objeto de la biblioteca y examinarlos. Esto debería dar algunas indicaciones sobre qué pasos se están portando mal. –