静态库单独使用很好,但在引用时会抛出错误



我正在使用Visual Studio 2017在一个解决方案中开发一个新的静态库和一个Win32应用程序。这个想法很简单,我的 Win32 项目引用了静态库。但是,我不能。

静态库单独构建时很好。但是,如果我生成引用库的 Win32 应用程序项目(或将其设置为启动项目(,则会出现很多错误。列举一些:name followed by '::' must be a class or namespace name'string': is not a member of 'std''WRL': a namespace with this name does not exist...我的理解和猜测是目标项目不理解静态库的链接。(我错了吗?

静态库本身是指stdMicrosoft::WRLMicrosoft::WRL::Wrappers...

我尝试查看链接静态库的方法(参考 lib 位置、lib 文件名、标头位置(,甚至尝试在静态库的 Librarian> 常规选项中启用链接库依赖项。没有用:(

还有其他我可以看的方向吗?提前感谢!

TL;DR:您需要包含定义 Win32 应用程序中类型的标头。C++静态库.lib仅在链接时提供符号,而不是在编译时提供符号。

C++库只是.obj文件的集合。您需要在应用程序中包含标头才能使用库。.lib本身仅提供链接器所需的目标代码,而不是编译器的类型定义。这个系统可以追溯到C的早期。

通常,为静态库设置一个公共标头,用于定义使用它所需的类型和入口点。然后,库本身可能有自己的内部标头,它在构建时使用这些标头,这些标头不适合"客户端"使用。

如果有多个公共标头,通常将它们放入特定目录(如incinclude(,然后将私有标头和所有其他源文件放在其他地方,如src/source目录。这种组织技巧意味着库的客户端将只包含公共标头,而不可能包含您的私有标头,因为它们应该只在其包含搜索路径中包含您的公共inc/include文件夹。

公共头文件中,您通常包括头本身编译所需的标准头(即<vector><string>等(。

在 Modern C++ 中,

最佳做法是将类型"包装"在 C++ 命名空间中,这对于小型项目或仅使用静态库在本地组织时并不重要,但当您想要共享静态库供其他开发人员使用时,它变得很重要。有一些技巧可以很好地使用C++命名空间,例如避免在标头中使用using namespace语句,在模块中使用匿名命名空间来隐藏私有类型等。有关基础知识,请参阅本教程。

请参见演练:创建和使用静态库 (C++(

有关使用最佳做法的 Visual C++ 库的一些示例,请参阅 DX11/DX12、DirectXTex 和 DirectXMesh 的 DirectX 工具包。

您需要更改 win32 应用程序的属性。

配置属性包括其他文件夹->C/C++->常规必须显示h文件的位置。

最新更新