我正在努力学习更多C ++并尝试了解不同编译器及其技术的基础知识。我搜索了很多,但每次我介入时,我碰巧遇到了需要更多解释的新术语。那么,这个主题中的静态编译,动态链接等术语是什么意思呢?
答案 0 :(得分:4)
关于静态或动态linking,另请阅读Levine's Linker & Loader book。
关于共享或静态库,请阅读Program Library HowTo
对于Linux上的共享对象(或库),请阅读Drupper's How To Write Shared Libraries paper
您可以使用dlopen(3)加载插件,然后阅读C++ dlopen mini-howto。
Compilation通常是静态的,因为它是ahead of time(例如,在使用GCC进行编译时)。有时,just in time compilation已完成(例如大多数JVM)。
如果在Linux上使用C ++进行编码,则需要使用g++ -Wall -g
进行编译(稍后使用-O2
要求GCC在调试程序时进行优化)。请参阅this和that提示。
另外,学习C++11并使用最新的GCC 4.8.2编译器(GCC 4.9可能会在几周内发布,例如2014年3月或4月)。
答案 1 :(得分:4)
某些语言(如C ++)将所有程序编译为CPU在开始运行(即实际使用)之前理解的“本机代码”。这是“静态编译”。
其他语言(例如Java)使用“Just In Time”编译器从程序的其他“字节代码”表示中生成CPU本机代码,但只在它们开始运行时才这样做。这是“运行时”编译。
许多其他语言(例如常见的python,perl,ruby,Java实现)使用“解释器”,这意味着它们具有本机代码,不断咨询某种“字节码”以确定下一步要做什么。 (一些非常基本的公司间或专业解释器甚至不会在不生成更紧凑的字节码表示的情况下继续查询源代码,但是没有流行的语言可以做到这一点 - 它非常缓慢而且笨拙)。
单一语言可能会使用这些方法的任意组合,但通常它是静态编译,或者是可能添加即时编译器以加速执行的解释器。
有时,单一语言的实现使用不同的方法,例如:C ++解释器有限(如http://root.cern.ch/drupal/content/cint,但我从来没有听说过“愤怒”使用它),以及系统将python编译为本机代码。
对于“动态链接”:假设你有一个函数“void f();”做的很棒。如果将该函数放在库中供许多应用程序使用,则可以将该函数“静态链接”到特定的应用程序中,以便在程序的可执行文件的特定时间点获取f()
的功能“快照”。正在创建。然后,如果f()
稍后更改,您必须重新链接并重新分发您的应用程序,以将更改合并到f()
。或者,您可以将f()
放入动态链接库中,这意味着包含f()
的单独库文件将与您的程序一起或独立地分发。每次程序开始运行时,如果查看动态库文件以查找用于f()
的代码。因此,如果您分发更新的动态库,则可以更新f()
,而无需重新分发调用f()
的所有应用程序。有时,这只是向用户分发更新软件的更好模型,并且避免让每个单独的应用程序参与向f()
分发更新。 (有时候这是一场灾难,因为f()
的动态版本实际上没有经过应用程序的测试,并且做了一些巧妙的改变,破坏了应用程序。)