像GCC和Clang这样的编译器允许在没有C++标准库的情况下编译C ++程序,例如使用-nostdlib命令行标志。 然而这些编译器常常失败,无法链接程序,例如:
<code>void f() noexcept { throw 42; }
int main() { f(); }
</code>
通常因为未定义的符号而无法链接,例如
__cxa_allocate_exception
、typeinfo for int
、__cxa_throw
、__gxx_personality_v0
、__clang_call_terminate
、__cxa_begin_catch
、std::terminate()
等。
即使是简单的
int main() {}
链接失败
ld: 警告: 找不到入口符号 _start
;默認為0000000000400120
并且在执行时被操作系统杀死。使用-c
标志,编译器仍会运行链接器,但以下错误会明显导致链接失败:
ld: mytest
(.eh_frame
)中的错误;将不会创建.eh_frame_hdr
表。
是否有可能在不使用和链接到标准库的情况下编写和编译C++应用程序或库?如何在Linux上使用GCC或Clang编译代码?如果没有标准库,哪些核心语言特性将无法使用?
_start
的C运行时库)和你可能需要异常库支持的libsupc++
。 - Alexander Ohcrtn.o
等)。对于异常,一些C++ ABI运行时库应该提供必要的功能(libcxxabi?)。 - Kerrek SB-c
链接" 是什么?-c
告诉GCC不要进行链接。 - interjay