c++ - 我应该如何在 Win32 C++ 应用程序中集成和打包此第三方库?

标签 c++ windows com shared-libraries kml

我们有一个(非常大的)自定义 ActiveX 控件的现有代码库,我想集成 libkml为了与 KML map 数据交互,而不是重新发明轮子。问题是,我是一个相对较新的 Windows 开发人员,来自 Linux 世界,我真的不确定集成第三方库的正确方法是什么。值得庆幸的是,libkml 确实提供了用于编译它的 MSVCC 项目,因此移植不是问题。我想我有几个我能想到的选择:

  1. 直接构建和链接库。对于“主”项目,我们已经有了一个包含项目文件的解决方案;我可以将 libkml 项目添加到该解决方案,但我宁愿不这样做。 libkml 代码相对于我们的应用程序代码发生变化的可能性很小。

  2. 静态链接到 libkml build 生成的 .lib 文件。这是没有吸引力的,因为 libkml 解决方案中有六个 .lib 文件,在链接器选项等中手动指定它们似乎不够优雅。

  3. 按原样将代码打包到 DLL 中。也许用 COM?似乎如果我在没有任何翻译的情况下这样做,我最终会付出很多开销,而且由于我对 COM 相当不熟悉,我不知道公开我的所有功能会涉及多少工作'我想通过 COM 使用。这个库相当大,有很多它使用的类,如果我必须手动编写代码来公开所有这些,我会犹豫是否要走这条路。

  4. 编写包装器代码以提取我需要的功能,将其打包到 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/

相关文章:

c++ - 为什么 CHAR_BIT 通常是 8?

php - 如何测试 Windows 上的文件是否可以从 PHP 中删除?

windows - GUI 是 Windows Serial 中 WinTER 的一部分吗?

c# - 除了 "await"之外还有哪些情况会允许同步代码被中断

.net - 通过 COM 对象将 Delphi 生成的位图返回到 (ASP).Net

email - MAPI Windows 7 64 位

c++ - C++中的'this'是指向引用的指针?

c++ - gcc 链接的默认库?

c++ - Visual Studio 2013 中可能存在的 ADL 错误

windows - for/f 立即关闭cmd提示符