我使用过几个Visual C ++编译器(VC97,VC2005,VC2008),我还没有真正找到一种向我的构建中添加外部库的清晰方法。我来自Java背景,在Java库中是一切!
我理解在Linux机器上编译开源项目时,除了那些.so文件之外,似乎需要包含库的所有源代码。
我也听说过.lib静态库和.dll动态库,但我还是不完全确定如何将它们添加到构建中并使它们工作。怎么会这样呢?
答案 0 :(得分:15)
C ++中的库也被认为是有用的,但是它们集成它们的方式与Java不同,因为编译器只需要查看库的接口,它通常在头文件中声明。在Java中,编译器必须检查实际的库,因为Java在外部可见的头文件和提供实现的生成的目标代码之间没有区别。
您通常做的是单独构建库一次,并将生成的lib / dll文件和头文件放入需要库可以访问的项目的位置。一个常见的习惯用法是将头文件放入include
,将静态库放入lib
,将动态库放入bin
子目录中,以便编译库。
您发现大多数C ++库以源代码形式提供而不是以预编译形式提供的原因是每个C ++编译器都有一定的自由来如何破坏符号名称等,并且生成的对象代码不可移植编译器,更不用说操作系统了。因此,运送已编译的代码对于许多应用程序来说没有意义。您偶尔会在Windows上使用闭源C ++库找到它(C库是完全不同的事情),但供应商必须为每种构建类型提供编译版本(Release,Debug,32 bit,64比特等)和目标编译器(各种版本的Visual Studio需要不同的二进制文件,然后是Borland和其他一些编译器),它很快成为支持的噩梦......
当您使用库并将其构建为Windows上的动态库(即DLL)时,编译器/链接器通常会为其生成一个静态“导入”库(同名,只有.lib扩展名) 。将项目与动态库链接时,将.lib文件指定为库依赖项。将应用程序与所述导入库链接允许链接器记录对.dll文件的依赖性以及它应该期望库提供的符号。
使它们工作 - 在程序中在Windows上找到它们 - 通常要求.dll文件与可执行文件位于同一目录中,或者通过'PATH'环境变量及其在Visual C ++中的等效文件可访问。
答案 1 :(得分:8)
确定。通常,您不希望手动加载动态库,但如果您这样做,请查看LoadLibrary。 然后你必须调用其他函数来获取函数指针地址等等。 通常它是如何工作的,甚至.dll文件也有.lib文件。所以当需要它们时,它们只是自动加载。
如何指定.lib文件/静态库位于Properties / Linker / Input-> Additional Dependencies下。在gui。
如果你正在编写脚本...好吧。您只需在链接时指定命令行上的.lib文件。
答案 2 :(得分:7)
我认为您可能会询问如何在IDE中向项目/解决方案添加lib的机制......
在2003年,2005年和2008年,它类似于:
来自解决方案资源管理器的- 右键单击该项目 选择属性(通常是最后一个) 我通常选择顶部的所有配置...... 链接 输入
其他依赖关系进入
我希望我可以为此进行屏幕截图。
在VC6中,它与我不同,因为这完全来自记忆
项目设置或属性,然后转到链接器选项卡,找到可以添加库的位置。
请原谅这篇文章的偶然性质。我认为这就是你想要的。
答案 3 :(得分:3)
对于添加库,这非常简单(如果这就是你的意思)Project - >属性 - >配置属性 - >链接器 - >输入 - >其他图书馆。站在其中一个库上,按回车键。你释放了一个空间来添加一个库,就像馅饼一样:)
答案 4 :(得分:2)
要在VC ++项目中添加外部库或库目录,请执行以下步骤:
1-转到项目属性(可以通过右键单击解决方案中的项目来完成)
2-选择“链接器”> '一般'>其他图书馆目录
3-单击“其他库目录”前面的空白栏,VS允许您将目录添加到其中搜索所需库的默认目录。
答案 5 :(得分:1)
你的意思是“将它们添加到构建中”?
在VC中,在解决方案中,您可以拥有一个项目,其输出是库(静态或动态),然后是另一个依赖于输出并使用它的项目(即链接到它)。
在我们的代码库中,我们通常为每个库或一组库提供单独的解决方案,然后将它们链接到目标项目中。我们的大多数目标项目都是托管程序集 - 那些需要非托管功能的程序通常用托管C ++或C ++ / CLI编写,并链接在非托管静态库中。我们发现这是最容易维护的,因为非托管库的变化最小。