我们有一个(非常大的)自定义 ActiveX 控件的现有代码库,我想集成 libkml
为了与 KML map 数据交互,而不是重新发明轮子。问题是,我是一个相对较新的 Windows 开发人员,来自 Linux 世界,我真的不确定集成第三方库的正确方法是什么。值得庆幸的是,libkml
确实提供了用于编译它的 MSVCC 项目,因此移植不是问题。我想我有几个我能想到的选择:
直接构建和链接库。对于“主”项目,我们已经有了一个包含项目文件的解决方案;我可以将
libkml
项目添加到该解决方案,但我宁愿不这样做。libkml
代码相对于我们的应用程序代码发生变化的可能性很小。静态链接到
libkml
build 生成的.lib
文件。这是没有吸引力的,因为libkml
解决方案中有六个.lib
文件,在链接器选项等中手动指定它们似乎不够优雅。按原样将代码打包到 DLL 中。也许用 COM?似乎如果我在没有任何翻译的情况下这样做,我最终会付出很多开销,而且由于我对 COM 相当不熟悉,我不知道公开我的所有功能会涉及多少工作'我想通过 COM 使用。这个库相当大,有很多它使用的类,如果我必须手动编写代码来公开所有这些,我会犹豫是否要走这条路。
编写包装器代码以提取我需要的功能,将其打包到 COM DLL 中并与之交互。我想这似乎是明智的,但很难确定我需要多少抽象,因为我还没有编写将使用
libkml
的代码。
让我重申一下:我还没有编写将与 libkml
交互的代码,所以这主要是实验性的。选项 1 和 2 也很复杂,因为 libkml
还依赖于另外三个也在 .lib
文件中的外部库(我不得不重新编译以获得代码生成标志对齐)。目标显然是让代码正常工作,但可维护性和源代码树组织也是目标,所以我倾向于选项 3 和 4,但我不知道在 Windows 上实现这些的最佳方法。
最佳答案
键入六个文件名,或使用带有 #pragma comment(lib, "foo.lib") 的声明式样式,与将其转换为 DLL 或 COM 服务器所要做的工作相比,这些都是小菜一碟。
发行版严重偏向于将其用作静态链接库。只有参差不齐的声明可用于将其转换为带有 __declspec(dllexport) 的 DLL。它们仅存在于第 3 方依赖项中。当然,所有这些都使用不同的#defines,您将在项目的预处理器定义中键入一堆名称。
此外,您将很难在运行时实际加载此 DLL,因为您是在 COM 服务器中使用它。当 COM 创建您的控件实例时,DLL 的搜索路径将是客户端应用程序的路径,不太可能靠近您部署 DLL 的位置。
让它成为一个 COM 服务器是一项很多的工作,您必须自己编写所有的接口(interface)胶水。同样,源代码中没有任何内容对此有任何帮助。
关于c++ - 我应该如何在 Win32 C++ 应用程序中集成和打包此第三方库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134624/