C++ 项目环境中的基础概念

148 阅读6分钟

首先是开发项目时创建项目需要明确自己创建什么类型的项目

在C++中,**可执行文件(Executable)库文件(Library)**是两种不同类型的编译产物,它们的用途和使用场景也有所不同。以下是两者的主要区别及其使用场景:

1. C++可执行文件(Executable)

  • 定义:可执行文件是通过编译和链接生成的独立程序,可以直接运行,比如Windows系统中的.exe文件,Linux系统中的无扩展名文件。
  • 特点
    • 包含了完整的程序代码,可以直接被操作系统加载执行。
    • 通常在开发应用程序时生成,如桌面软件、控制台应用等。
    • 一旦编译完成,不需要其他依赖就可以直接运行(静态链接的情况下)。
  • 使用场景
    • 当需要生成一个可以独立运行的程序时,比如客户端软件、命令行工具、游戏等。
    • 用于交付最终用户,可以直接安装和使用的应用程序。
    • 通常在应用程序的最后阶段,代码编译生成的就是可执行文件。

2. C++库文件(Library)

  • 定义:库文件是包含可被其他程序或库使用的代码集合。它不能直接运行,需要被其他程序链接和调用。库文件分为两种:静态库动态库
  • 类型
    • 静态库(Static Library):如.lib(Windows)或.a(Linux)文件,在编译时被链接到最终的可执行文件中,代码会被复制到可执行文件内。
    • 动态库(Dynamic Library):如.dll(Windows)或.so(Linux)文件,在运行时动态加载,不会被直接编译进可执行文件,减少了可执行文件的体积。
  • 特点
    • 库文件只包含代码逻辑,实现共享和复用,不包含应用的主函数。
    • 通常包含工具函数、算法、驱动等常用逻辑代码,便于在多个项目中复用。
    • 动态库可以在不重新编译可执行文件的情况下更新或替换,提供了更好的灵活性。
  • 使用场景
    • 当多个应用程序需要共享相同的代码逻辑时,比如常见的算法库、数学运算库、图形渲染库等。
    • 动态库适用于需要独立更新或替换功能的场景,比如插件系统、跨平台开发。
    • 当希望减小可执行文件的大小,或者希望在不同应用间共享代码时,动态库更合适。

总结

  • 可执行文件:独立运行的程序,主要用于直接交付给最终用户。
  • 库文件:复用性强的代码模块,可供其他程序调用,适用于需要代码复用、共享和灵活更新的场景。

在实际开发中,两者通常是配合使用的:库文件提供基本的功能模块,可执行文件则使用这些库实现特定的应用逻辑。

接着, library的类型也是需要注意的

在C++中,**库(Library)**主要有两种类型:静态库(Static Library)共享库/动态库(Shared Library / Dynamic Library)。这两种库在编译、链接、部署以及运行时的特性上存在明显的差异。以下是它们的区别和各自的使用场景。

1. 静态库(Static Library)

  • 文件扩展名:通常为.lib(Windows)或.a(Linux)。
  • 链接方式:在编译阶段被直接链接到生成的可执行文件中,库的代码会被复制到每一个使用它的可执行文件里。
  • 运行时:不需要额外的库文件,因为库代码已包含在可执行文件中。
  • 优点
    • 独立性:生成的可执行文件在运行时不需要依赖额外的库文件,便于分发。
    • 性能:因为静态链接后的代码直接嵌入在可执行文件中,程序启动时不需要动态加载,性能稍高。
  • 缺点
    • 占用空间大:每个使用静态库的可执行文件会包含一份库的副本,导致磁盘空间浪费,特别是当多个应用程序都使用同一个库时。
    • 更新困难:若库的代码有更新,需要重新编译所有依赖它的可执行文件。
  • 使用场景
    • 稳定性和独立性要求高的场合,比如嵌入式系统或需单独部署的应用。
    • 在需要减少外部依赖的情况(如减少第三方动态库的版本兼容问题)。

2. 共享库 / 动态库(Shared Library / Dynamic Library)

  • 文件扩展名:通常为.dll(Windows)或.so(Linux)。
  • 链接方式:在编译阶段会生成一个对动态库的引用,而库的代码不会被直接嵌入到可执行文件中。程序运行时由操作系统动态加载该库。
  • 运行时:需要确保动态库文件在程序运行时可以被找到,否则程序会报错。
  • 优点
    • 内存共享:多个进程可以共享同一个动态库的代码段,减少内存占用。
    • 体积小:可执行文件中不包含库的代码,使得可执行文件本身的体积较小。
    • 易于更新:动态库可以独立更新,无需重新编译依赖的可执行文件,只要库的接口保持不变即可。
  • 缺点
    • 依赖性:运行时需要动态库文件,如果库文件缺失或版本不匹配,可能导致程序无法启动或运行异常。
    • 加载开销:程序启动时需要额外加载库,可能会稍微增加启动时间。
  • 使用场景
    • 大型应用程序或插件系统中,多个模块共享同一个库,降低内存和磁盘占用。
    • 需要在程序运行时更新或替换库功能,比如需要动态加载特定功能模块的场合。

总结

特性静态库(Static Library)动态库 / 共享库(Shared Library)
文件扩展名.lib(Windows)、.a(Linux).dll(Windows)、.so(Linux)
链接方式编译时嵌入到可执行文件中运行时动态加载
体积可执行文件体积较大可执行文件体积较小,库体积单独存在
内存占用每个进程有独立的库副本多个进程可共享同一库的内存
更新方式需重新编译所有可执行文件更新库文件即可,无需重新编译
使用场景稳定、独立部署的应用插件系统、大型项目中的模块化共享

在实际项目中,根据项目的规模、部署环境和需求灵活选择静态库或动态库。