【发布时间】:2010-12-25 06:41:58
【问题描述】:
我正在尝试将静态创建的 .a 库与另一段 C 代码链接。
但是,在最终的可执行文件中,使用nm 命令查看时会发现缺少几个符号(函数名称)。这是因为链接器(被调用的gcc)正在剥离与库链接的另一段C 代码中未引用的符号。我尝试使用nm 命令查找的函数符号在.a 库中可见。
如何使链接器不以这种方式去除省略的符号?
【问题讨论】:
标签: static-linking
我正在尝试将静态创建的 .a 库与另一段 C 代码链接。
但是,在最终的可执行文件中,使用nm 命令查看时会发现缺少几个符号(函数名称)。这是因为链接器(被调用的gcc)正在剥离与库链接的另一段C 代码中未引用的符号。我尝试使用nm 命令查找的函数符号在.a 库中可见。
如何使链接器不以这种方式去除省略的符号?
【问题讨论】:
标签: static-linking
通常您需要在应用程序中调用一些注册函数来生成这样的引用。当然如果你无法访问第一个库的代码,你只能使用 tommieb75 描述的 -g 选项。
【讨论】:
一般来说,链接器会去掉其他符号——主要是为了
这里有两种思路:
从本质上讲,这两者是相互排斥的——你不能将两者结合起来。
因此,这取决于您使用了哪些开关来实现这一点。通常,-g 开关用于在公开发布之前进行内部调试和测试。相反的是-O2 这样的东西,它使编译器足够聪明,可以生成一个可执行文件,该可执行文件被认为是优化的,例如删除死变量、展开循环等等。
希望这对您有所帮助并给您提示
【讨论】:
使用 -dynamic 在 gcc 中编译以强制编译器包含所有符号。但请确保这是您真正想要的,因为这很浪费。
可能对某些静态工厂模式有用。
【讨论】: