【发布时间】:2016-08-18 13:34:52
【问题描述】:
我们什么时候使用 gcc -u 编译器选项? 你也可以举个例子吗?
https://gcc.gnu.org/onlinedocs/gcc-2.95.2/gcc_2.html 说如下:
假装符号符号未定义,强制链接库 模块来定义它。你可以多次使用不同的`-u' 符号来强制加载额外的库模块。
【问题讨论】:
-
我们不使用它——几乎从不使用它。 (在过去的 30 年里,我不需要使用它,AFAICR。)当你需要它时,你就会知道该怎么做。在那之前,不要担心。 GCC 有很多其他类似的选项——如果你需要做一些神秘的事情,它们是非常宝贵的,但 99.99% 的时间是不相关的。
-
@JonathanLeffler,我目前确实需要它,但我终生无法弄清楚如何让它发挥作用。我正在尝试构建一个动态库,该动态库在头文件中具有一个函数,该函数需要静态库中的单个符号,但是由于它在头文件中,它不会自动为我链接静态库,因为从技术上讲,当我编译我的library 该符号尚未使用。这意味着我的库的客户必须知道链接静态库...您知道如何使“-u”选项起作用吗?或者更好的是,您对我的问题有更好的解决方案吗?
-
@tjwrona1992:我想我可能会创建一个包含
#include "header.h"的文件libname.c,然后使用通常的规则在您的平台上构建一个共享库,可能使用列出的静态库创建共享库的命令行。我不相信这会奏效。让共享库从静态库中调用符号可能意味着必须将静态库链接到可执行文件中,共享库才能找到该符号。这就是共享库和静态库之间的区别;你不能只按需加载静态的。 -
您可能需要使用:
gcc -u staticlibsymbol -o prog obj1.o … -ldynamic -lstatic …(其中libdynamic.so或任何用于共享对象,libstatic.a是静态库),这可能会导致符号staticlibsymbol来自要链接到可执行文件的静态库,以便在运行时对动态库可用。如果您已经尝试过,那么您可能需要使用 MCVE (minimal reproducible example) 就 SO 提出一个新问题。它可以合法地交叉引用这个问题——我几乎说 Q&A,但这里没有正式的 A。 -
问题中的链接是编译器的古老版本。但是,您可以从Linker Options 上的 GCC 8.2.0 手册中获得大致相同的信息。
标签: c gcc compiler-flags