首先,传统的编译,也就是静态编译是把源文件翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。
后来的Java和等语言,首先编译成中间形式,然后运行过程中根据需要编译成本地代码(注意这个过程不是一次性的,下次运行重新编译),这个就是JIT(即时编译)技术,从即时编译发展出了动态编译技术————————————(传统的)编译完成后,像C/C++、Fortran、汇编等语言,可以把多个目标文件合并到一个库文件中,这个就是静态库。
比如常说的库函数printf就是libc里面的函数。
如果有了启动函数(main),main里面使用了printf,就可以通含配过静态链接技术,从libc中提取出printf所在的文件加入到可执行谈仔指文件中,如果printf还需要其它函数,就继续搜索并加入戚族列表,直到形成一个闭包。
这个就是静态链接。
可是静态链接有个明显的缺点,如果每个程序都需要printf,那么printf这个函数的代码就会同时存在在每个程序中,这样也太占地方了吧。
所以发明了动态连接技术,其实有两种形式。
无论哪一种,都是首先记录下需要调用printf这个函数以及所在的动态库,等到运行的时候再加载动态库,从动态库中找到真正的printf去执行。
由于,动态链接技术需要一些额外的信息,传统的静态库是不具备的,这些额外信息主要是重复加载和卸载时所需要的一些代码,因此需要动态链接库。
cmake生成静态库有哪些方法?
cmake生成静态库有多种方法。
本文将详细解释源码、object库以及混编方式生成静态库的过程。
使用源码生成静态库时,需要将代码组织成树咐如吵状结构,并在每个主目录衡侍下创建文件以方便管理。
可以使用变量收集所需源码,然后一起编译成静态库。
设置cmake版本要求、全局C++标准,以及是否启用编译器扩展等功能。
使用add_subdirectory命令将子目录加入编译系统。
src目录下的文件将目录添加至编译系统,同时使用set函数设置变量,如add_src变量,将子目录路径赋值给它。
在子目录的文件中使用add_library命令创建静态库,需要明确使用STATIC关键字。
使用链接object库的方式编译静态库时,首先将cpp文件编译成object文件,然后将这些object文件打包成静态库。
在文件中,使用add_library命令创建静态库目标,并指定需要的object库。
使用target_link_libraries命令将静态库链接到其他库,但实际上这是打包object文件的过程。
通过运行命令生成静态库,使用nm命令检查库内容,确认已包含所需功能。
使用object库和源文件生成静态库时,首先创建object库,然后在src目录下的文件中添加源文件和包含目录,最后使用add_library命令创建静态库目标,指定源文件和包含目录。
编译后,使用nm命令检查静态库内容,确认已包含所有功能。
使用静态库生成静态库的尝试不可行。
静态库无法在链接阶段直接包含其他静态库,因此,如果需橡中要使用多个静态库的功能,必须分别编译并链接到最终的静态库中。
在实际项目中,通常会为每个功能模块生成独立的静态库,然后在主项目中链接这些静态库。