我曾使用过几个 Visual C++ 编译器(VC97、VC2005、VC2008),但我还没有真正找到将外部库添加到我的构建的明确方法。我来自 Java 背景,Java 库就是一切!
通过在我的 Linux 机器上编译开源项目,我了解到似乎需要包含该库的所有源代码,但那些 .so 文件除外。
我也听说过 .lib 静态库和 .dll 动态库,但我仍然不完全确定如何将它们添加到构建中并使其工作。怎么办?
最佳答案
C++ 中的库也被认为很有帮助,但集成它们的方式与 Java 不同,因为编译器只需要查看库的接口(interface),它通常在头文件中声明。在 Java 中,编译器必须检查实际的库,因为 Java 在外部可见的头文件和生成的提供实现的目标代码之间没有这种区别。
您通常所做的是将库单独构建一次,然后将生成的 lib/dll 文件和头文件放入需要该库的项目可以访问的位置。一个常见的习惯是将头文件放入include
,将静态库放入lib
,将动态库放入编译库的bin
子目录。
您发现大多数 C++ 库都以源代码形式提供而不是以预编译形式提供的原因是每个 C++ 编译器在如何修改符号名称等方面都有一定的自由度,并且生成的目标代码不可移植编译器,更不用说操作系统了。因此,发布编译后的代码对很多应用程序来说没有意义。您偶尔会在 Windows 上使用闭源 C++ 库找到它(C 库是完全不同的事情),但是供应商必须为每种构建类型(发布、调试、32 位、64 bit 等)和目标编译器(各种版本的 Visual Studio 需要不同的二进制文件,然后是 Borland 和一堆其他编译器),它很快成为支持的噩梦......
当您将一个库构建为 Windows 上的动态库(即 DLL)时,编译器/链接器通常会为其生成一个静态“导入”库(同名,只是扩展名为 .lib) .当您将项目链接到动态库时,您将 .lib 文件指定为库依赖项。将您的应用程序与所述导入库链接允许链接器记录对 .dll 文件的依赖关系以及它应该期望库提供哪些符号。
使它们工作——从程序在 Windows 上找到它们的意义上说——通常要求 .dll 文件与可执行文件位于同一目录中,或者通过“PATH”环境变量及其在 Visual C++ 中的等效项进行访问。
关于c++ - 如何在 VC++ 中添加用于编译的外部库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212492/