
因为那些“编译过的C代码”不包含在目前project的代码中,所以他们就是extern,是外部的。又因为C语言的
函数的调用中采纳数传递有别于其他计算机语言, extern c,就是告诉编译器,调用这个函数时,给其传递参数,就采用C语言的约定方式传递就好(不用这种方式,就不能正确传递参数了,就会出错)。在linux上,你在ps中说的那种"将动态库作为一个参数传到程序里"的使用方式,是通过dlopen函数将.so加载到当前进程中,并且通过ld.so将.so"链接"进当前进程。这个"链接"过程包括:查找未定义
符号在当前进程中的地址、分配数据/代码/bss段内存(数据初始化全局变量、代码段重定位)、执行constructor函数等。之后,可以使用dlsym在已知符号名的情况下通过符号名查找符号对应的地址。这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System V的C++ API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern "C"修饰之后,变成C的函数名,则无名称修饰,便于使用。
作者:yin jie
链接:https://www.zhihu.com/question/29988788/answer/46352593
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
现在国内的很多书籍是以Centos
系统为平台编写的,当然作者大多会列出来诸多的理由,但很多都是以讹传讹的歪曲道理,根本没有剖析到RedHat公司的运作方法和Centos系统的本质,Centos系统是通过将RHEL系统释放出的源代码二次编译的Linux系统之一,命令 *** 作和服务配置方法自然都是完全相同,去掉了很多红帽收费的服务套件功能,并且不提供任何形式的技术支持,那么选择的理由只有一个——免费!,当“高手们”大举免费、开源、正义的旗帜来宣扬Centos系统的时候,诸不知Centos系统其实早在2014年初就已经被红帽公司收购,只是战略性的免费而已,而根据Gnu GPL许可协议,我们同样也可以免费使用RHEL系统,甚至是修改代码后创建出衍生产品,自由程度是没有任何的差异,更无关道德问题。
评论列表(0条)