【问题标题】:How to use gcc command with '-static'如何将 gcc 命令与“-static”一起使用
【发布时间】:2016-03-23 03:52:32
【问题描述】:

当我尝试使用 gcc 命令编译带有静态库“t1”的测试程序时,该库由我自己存档。

我用来归档静态库的命令如下:

ar rcv libt1.a t1.o

使用以下命令得到一个错误:

gcc -L. -static -lt1 t.c -o t

ld: library not found for -lcrt0.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是,如果我像这样删除“-static”:

gcc -L. -lt1 t.c -o t

编译成功。我得到了正确的结果。

但是我搜索了很多,发现其他人使用'-static',他们没有得到错误。所以,请帮我弄清楚。

【问题讨论】:

  • -static 不需要链接到静态库,而是静态链接到 C/C++ 运行时库,AFAICT 不是您想要实现的;你可以没有它。对了,你为什么要把.c文件放到静态库中?
  • @MatteoItalia 这是一个写入错误,我的意思是“t1.o”。
  • gcc 链接器从左到右检索/处理命令行参数,所以我很惊讶这两种方法都有效。 IE。 -L-l 应该在行尾。

标签: c gcc static-linking


【解决方案1】:

正如评论中所解释的,-static 不需要链接到您的静态库,但用于指示编译器静态链接到 C(和 C++,如果是 g++)运行时库。 OS X 上的 is not supported(链接取自上面的 linked answer),因此出现错误。

要链接到您的静态库,只需按照您在第二个命令行中所做的操作,无需指定 -static

但是我搜索了很多,发现其他人使用'-static',他们没有得到错误。所以,请帮我弄清楚。

他们可能在 Linux 或 Windows 上工作,其中支持针对 libc 的静态链接(尽管即使在 Linux 上它也会带来相当多的问题)。

【讨论】:

    【解决方案2】:

    ar rcv libt1.a t1.c

    错字?您通常不需要库中的 C 源文件.....

    众所周知,Clang 有点挑剔,尤其是对于静态库(这是在 MacOS 上,是否有机会?)并且会尝试链接到不存在的运行时库 - 您可以通过移交静态库来解决这个问题作为目标文件的库,而不是像

    这样的
    gcc t.o libt1.a -o t
    

    这应该可行。

    【讨论】:

    • 这是一个写入错误,我的意思是“t1.o”,我真的在 MacOS 上工作。你给出的命令也可以,但我只是好奇为什么“-static”犯一个错误。
    猜你喜欢
    • 2012-10-17
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多