【问题标题】:Linking to thin archive on Snow Leopard链接到 Snow Leopard 上的精简存档
【发布时间】:2012-08-14 03:56:11
【问题描述】:

我正在尝试将结合了两个存档库的精简存档链接到 C 程序。

我构建了两个简单的 hello world 函数并使用命令构建了一个存档:

ar rcs lib1.a lib1.o
ar rcs lib2.a lib2.o

然后使用精简存档合并两个存档:

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 中的 _main ld:未找到架构 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。


生成文件

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

【问题讨论】:

    标签: c osx-leopard unix-ar


    【解决方案1】:

    这些来源和 makefile 使用标准 Apple 工具毫无怨言地链接。您使用的工具是否支持“-arch”开关,因此您可以明确指定“-arch x86_64”或“-arch i386”?

    您可以使用“file”命令查看目标文件和可执行文件中的架构。对于库文件,您可能必须提取模块并检查它们。

    【讨论】:

    • 我正在使用在 macport (gcc46) 中找到的 64 位版本的 gcc。我没有使用标准的苹果编译器,因为它没有随 gfortran 一起提供。我目前正在安装 gcc46+universal。我相信精简存档不喜欢 64 位存档。
    • 我建议您使用“file”命令检查每个目标文件,然后从库中提取所有目标文件并检查它们。这应该可以指出哪些步骤行为不端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多