【问题标题】:how can i force gcc to link a static library?如何强制 gcc 链接静态库?
【发布时间】:2012-01-06 14:30:31
【问题描述】:

我写了一个静态库:libA.a。我有另一个名为 B.o. 的应用程序。 B.o 没有使用 libA.a 中的任何函数。我想将libA.o合并到B.o中,然后在B.o运行时,我可以通过其他方法调用libA.a中的一些东西。

我这样写makefile:gcc B.c -o B.o -lA -u symbol_A。这里 -u 来自 GCC 手册:

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

建议使用 -u 强制链接未使用的库,而 symbol_A 是 libA.a 中的某个符号

但它不起作用。链接后,我在 B.o. 中找不到任何 LibA.a 的东西。

谁能给我一些提示?

p.s 我在windows下使用的是GCC 3.4.4,eclipse+CDT,B.o会部署在linux下。

【问题讨论】:

  • 您是在尝试创建目标文件还是可执行文件?如果是可执行文件,它们通常没有 .o 后缀。从外观上看,您试图取消定义函数 symbol_A.Here 以便 gcc 插入库中的定义。你有什么理由想要这样做?
  • 如果 B 中的任何内容都没有使用 libA 中的任何内容,那么 libA 中的任何内容都不会被添加。
  • p.s我用的是GCC 3.4.4,windows下eclipse+CDT,linux下会部署B.o。
  • 但是在这里,gcc.gnu.org/onlinedocs/gcc/Link-Options.html,GCC 的手册说它可以强制链接.....
  • @user1134355 仔细阅读说明。此选项告诉 GCC 符号未定义并强制链接,即使该符号可能已在您的目标文件中定义。

标签: c gcc linker static-linking


【解决方案1】:

GCC 对-u 标志的解释如下:

如果您的源代码中定义了符号 aka 变量或函数,请告诉 GCC 假装它是未定义的,所以它需要定义这样的变量或 您正在链接的库中的函数。

因此,如果您的B.c 没有可以在libA.a 中定义的任何内容,那么-u 标志将无济于事,因为symbol_A 不需要B.c 和同样的令牌B.o,所以将被简单地忽略。

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多