【发布时间】:2016-03-11 19:55:12
【问题描述】:
我有一个关于使用 GCC 链接器选项之一的问题:-Wl,--defsym。
前段时间我决定用 C++ 重写我的一个项目,但没有使用它的标准库,甚至没有链接到它(我使用 C++ 编译器将 .cpp 源文件编译为目标文件,但我使用 C 编译器链接它们)。
为此,我使用了以下编译器标志:
-fno-exceptions -fno-rtti -nostdlib -nodefaultlibs
以及以下链接器选项:
-Wl,--defsym -Wl,__cxa_pure_virtual=0
使用这些标志,我可以很好地编译和链接我的共享库。 但是在我尝试在一些简单程序中使用我的共享库(也使用上述标志编译和链接)后,我在运行它时遇到以下错误:
examples/bin/blink: symbol lookup error: examples/bin/libblink.so: undefined symbol: __cxa_pure_virtual
其中 blink 是可执行文件的名称,而 libblink.so 是我的共享库的名称。
我试图修复它,它看起来像用这个函数替换 --Wl,--defsym 链接器标志(适用于可执行文件和库):
extern "C" void __cxa_pure_virtual
{
while (true);
}
完成这项工作。为什么 --Wl,--defsym 在这种情况下不起作用? 我还想提一下,我在 Windows 下对此进行了测试,并且在那里运行良好。
【问题讨论】:
-
用 C++ 重写我的一个项目,但没有使用它的标准库,甚至没有链接到它到底为什么?标准库赋予了 C++ 力量!
-
不喜欢他的程序链接到 C++ 标准库的原因有很多。其中之一是嵌入式设备的空间限制。
-
我不明白的是:你用过虚函数调用吗?如果没有运行时支持,它应该如何工作?
-
我确实使用了虚函数调用,当然它们可以在没有“运行时支持”的情况下工作。虚函数调用只是取消引用 vtable 指针,因此 c++ std lib 不需要做任何事情。此外,我从 C 更改为 C++ 只是为了 oop(我厌倦了在 C 中编写类似 oop 的代码),我不想为此牺牲二进制大小。
-
编译器没有链接。没有 GNU C 链接器。