一般来说,这是正常的。在 C++ 中,“库”由 .lib/.dll 和 .h./.hpp 对组成,您需要它们。由于编译器和链接器实际上是不同的工具,因此您对它们有不同的配置设置。
实际上,要能够使用外部库,您需要配置的不是2,而是4:
- 向 include-search-paths 添加一个条目和/或确保 .h 文件存在(在项目属性中)
- 向 library-search-paths 添加一个条目和/或确保 .lib 文件存在(在项目属性中)
- 通过将 .lib 文件添加到链接器选项(在项目属性中)来将其包含在链接中
- 将该 .h 包含在带有正确相对路径的 #include 中(在代码中)
然而,确实有点确实有一种方法可以提供类似于一个点的“包含”,所以至少最后两个 strong> 可以合并。
有一个
#pragma comment(lib, "foobar.lib")
(What does "#pragma comment" mean?)
可能提示工具集说明要包含哪个 .lib 文件的说明。如果你把它放到头文件中(在这种情况下,可能是foobar.h),那么你#include那个头文件的事实将使构建过程拾取那个lib并将它添加到链接阶段..
..或者理论上是这样。您可能会注意到,这是一个#pragma,也是一个comment,因此该过程可以简单地忽略它,或者可能根本没有实现该部分,这是100%可以的,因为它不是C++标准所要求的。幸运的是,VisualStudio 对此提供了支持——实际上我很早就理解该指令了。
但是!正如我所说,添加该指令是不够。该指令仅包含文件名,并将 .h 文件与 .lib 文件名链接。您仍然需要确保 .lib 位于 库搜索路径 中的某个位置,并且 .h 文件位于 包含搜索路径 中的某个位置。如果您的链接器设置指向某些目录,则需要确保 lib 文件已放入其中之一,否则您必须将目录路径添加到设置中,对于 .h/.hpp 文件也是如此。
这相对容易克服,只需在您的项目中创建一个额外的文件夹,将该路径添加到搜索路径,然后从现在开始,将所有其他 .h/.lib 文件放在那里。
如果可以的话,我会建议./3rdparty 之类的内容以及特定库的子文件夹,例如./3rdpart/xml', './3rdparty/zlib 等等。将“3rdparty”添加到两个搜索路径,然后添加#include 'xml/tinyxml.h' 等。否则您可能会遇到文件名冲突。当然,大多数库实际上不会附带#pragma-comment-lib,因此您可能需要手动添加该部分。