我有PHP,JS和C#的经验。
我使用http://learncpp.com中的教程来学习C ++。但是现在我对C ++标准库的链接过程有一些疑问:
我听说C ++标准库自动链接到C ++程序。有可能阻止这种情况吗? (我正在使用Visual C ++ 2010 Express)
C ++标准库是否存在于Windows,Mac OS X,Linux和Unix等主要操作系统上?
如果问题2的回答是正确的,为什么有些程序会重新分发Microsoft C ++ 2010 Redistributables?
C ++标准库实际上位于各种操作系统上?
如何将必需的C ++标准库文件嵌入到应用程序中?
感谢您的时间。
答案 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 有静态版本,但是......