5

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

1 に答える 1

-1

これらのソースとメイクファイルは、標準の Apple ツールを使用して問題なくリンクされます。使用するツールは「-arch」スイッチをサポートしているので、「-arch x86_64」または「-arch i386」を明示的に指定できますか?

「file」コマンドを使用して、オブジェクト ファイルと実行可能ファイルに含まれるアーキテクチャを確認できます。ライブラリ ファイルの場合、モジュールを抽出して調べる必要がある場合があります。

于 2012-08-17T18:28:44.670 に答える