如何编译C (如何编译c++项目)

公司代码 2024-12-17 06:27:31 浏览
项目

首先,传统的编译,也就是静态编译是把源文件翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。

后来的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命令检查静态库内容,确认已包含所有功能。

使用静态库生成静态库的尝试不可行。

静态库无法在链接阶段直接包含其他静态库,因此,如果需橡中要使用多个静态库的功能,必须分别编译并链接到最终的静态库中。

在实际项目中,通常会为每个功能模块生成独立的静态库,然后在主项目中链接这些静态库。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

热门推荐