2 つのアーカイブ ライブラリを組み合わせたシン アーカイブを C プログラムにリンクしようとしています。
2 つの単純な hello world 関数を作成し、次のコマンドを使用してアーカイブを作成しました。
ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o
2 つのアーカイブは、シン アーカイブを使用してマージされます。
ar rcsT all_lib.a lib1.a lib2.a
そしてgccでコンパイル:
gcc main.o all_lib.a -o hello
次のようなエラーメッセージが表示されます。
ld: 警告: ファイル all_lib.a を無視します。ファイルは、リンクされているアーキテクチャではない、サポートされていないファイル形式用にビルドされました (x86_64)
アーキテクチャ x86_64 の未定義シンボル: 「_func1」、参照元: main.o の _main 「_func2」、参照元: main.o ld の _main: アーキテクチャ x86_64 のシンボルが見つかりません
main.o を lib1.a および lib2.a に直接リンクしようとすると、すべてが機能します。
Mac OSX 10.6.8 で gcc (MacPorts gcc46 4.6.3_3) 4.6.3 と GNU ar (GNU Binutils) 2.21 を使用しています。
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");
}