c ++链接过程如何工作?

时间:2014-09-20 12:51:05

标签: c++ linker standard-library c++-standard-library

我有PHP,JS和C#的经验。

我使用http://learncpp.com中的教程来学习C ++。但是现在我对C ++标准库的链接过程有一些疑问:

  1. 我听说C ++标准库自动链接到C ++程序。有可能阻止这种情况吗? (我正在使用Visual C ++ 2010 Express)

  2. C ++标准库是否存在于Windows,Mac OS X,Linux和Unix等主要操作系统上?

  3. 如果问题2的回答是正确的,为什么有些程序会重新分发Microsoft C ++ 2010 Redistributables?

  4. C ++标准库实际上位于各种操作系统上?

  5. 如何将必需的C ++标准库文件嵌入到应用程序中?

  6. 感谢您的时间。

1 个答案:

答案 0 :(得分:1)

  

我听说C ++标准库自动链接到C ++程序。有可能阻止这种情况吗? (我正在使用Visual C ++ 2010 Express)

不确定MSVC ++ 2010,但在GCC中,您将-nostdlib标志添加到链接器标志。除非你知道自己在做什么,否则不建议这样做,因为在这些库中运行时确保调用静态构造函数和析构函数,初始化变量,清除可用空间,以及调用{{ 1}}。 (其中一个有用的情况是没有操作系统的嵌入式系统。)

  

C ++标准库是否存在于Windows,Mac OS X,Linux和Unix等主要操作系统上?

是。它是工具链的一部分。

  

为什么某些程序会重新分发Microsoft C ++ 2010 Redistributables?

因为Microsoft决定将部分运行时实现为共享库(a.k.a. DLL),而不是仅静态链接所有运行时,或者使共享库成为Windows的标准部分。此外,它可能包括Microsoft添加的特定于Windows的API,这些API在技术上不属于C ++标准库。

  

C ++标准库实际上位于各种操作系统上?

埋在工具链的某个地方。对于GCC,使用main命令:

gcc-config -L
  

如何将必需的C ++标准库文件嵌入到应用程序中?

它们像任何其他库一样链接,因此如果您想将它们硬连接,则使用这些库的静态版本。在Unix类型的操作系统中,您只需链接到库的$ gcc-config -L /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3:/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/32 $ ls /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3 32 hardenednopie.specs libgomp.la libstdc++.a crtbegin.o hardenednopiessp.specs libgomp.so libstdc++.so crtbeginP.o hardenednossp.specs libgomp.so.1 libstdc++.so.6 crtbeginS.o include libgomp.so.1.0.0 libstdc++.so.6.0.17 crtbeginT.o include-fixed libgomp.spec libsupc++.a crtend.o libgcc.a libitm.a libsupc++.la crtendS.o libgcc_eh.a libitm.la plugin crtfastmath.o libgcc_s.so libitm.so vanilla.specs crtprec32.o libgcc_s.so.1 libitm.so.1 crtprec64.o libgcov.a libitm.so.1.0.0 crtprec80.o libgomp.a libitm.spec 版本而不是.a版本。我不确定DLL 静态版本,但是......