2012-08-17 10 views
5

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"); 
} 

Respuesta

-1

estas fuentes y makefile enlace sin queja usando herramientas estándar de Apple. ¿Las herramientas que utiliza soportan un modificador "-arch", por lo que puede especificar explícitamente "-arch x86_64" o "-arch i386"?

Puede usar el comando "archivo" para ver qué arquitectura (s) se encuentran en archivos de objeto y archivos ejecutables. Para los archivos de la biblioteca, puede que tenga que extraer los módulos y examinarlos.

+0

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

+0

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. –

Cuestiones relacionadas