Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该如何在Win32 C+中集成并打包此第三方库+;应用程序?_C++_Windows_Com_Shared Libraries_Kml - Fatal编程技术网

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

C++ 我应该如何在Win32 C+中集成并打包此第三方库+;应用程序?,c++,windows,com,shared-libraries,kml,C++,Windows,Com,Shared Libraries,Kml,我们有一个(非常大的)自定义ActiveX控件的现有代码库,为了与KML映射数据交互,我想将其集成到其中,而不是重新发明轮子。问题是,我是一个相对较新的Windows开发人员,来自Linux世界,我真的不确定集成第三方库的正确方法是什么。谢天谢地,libkml确实提供了用于编译它的MSVCC项目,所以移植不是问题。我想我有几个选择可以考虑: 直接构建并链接库。我们已经有了一个解决方案,其中包含“主”项目的项目文件;我可以将libkml项目添加到该解决方案中,但我不愿意。libkml的code代码

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

  • 直接构建并链接库。我们已经有了一个解决方案,其中包含“主”项目的项目文件;我可以将
    libkml
    项目添加到该解决方案中,但我不愿意。libkml的
    code
    代码不太可能与我们的应用程序代码相关

  • 静态链接到由
    libkml
    build
    生成的
    .lib
    文件。这并不吸引人,因为有六个
    .lib
    文件来自
    libkml
    解决方案,在链接器选项等中手动指定它们似乎不太合适

  • 将代码打包为DLL中的代码。也许和COM一起?似乎如果我不做任何翻译就完成了这项工作,我会有很多开销,而且由于我对COM相当不熟悉,我不知道通过COM公开我想使用的所有功能需要做多少工作。这个库相当大,有很多它使用的类,如果我不得不手动编写代码来公开它,我会犹豫是否要走这条路

  • 编写包装器代码以抽象我需要的功能,将其打包到COM DLL中,并与之交互。我认为这似乎是合理的,但很难确定我需要多少抽象,因为我还没有编写使用
    libkml
    的代码


  • 让我重申一下:我还没有编写与
    libkml
    交互的代码,所以这主要是实验性的。选项1和选项2也变得复杂,因为
    libkml
    还依赖于另外三个外部库,它们也位于
    .lib
    文件中(我必须重新编译这些文件才能使代码生成标志对齐)。目标显然是让代码正常工作,但可维护性和源代码树组织也是目标,因此我倾向于选项3和4,但我不知道在Windows上实现这些功能的最佳方法。

    您还可以将所有需要的功能封装在非COM dll中。VisualStudio支持创建一个静态包装器库,该库在链接时将使您的程序使用dll。这样,您只需要指定一个依赖项,而不是六个


    除此之外,指定六个依赖项有什么不对。我假设这是六个独立的库而不是一个,这是一个很好的理由,因此谨慎地指定您实际使用的部分。

    也许我在这里遗漏了一些东西,但我真的看不出(1)有什么问题。我认为,即使您有多个使用libkml的项目,只要将libkml的项目文件插入到解决方案文件中,指定依赖项,就应该完成。很简单。即使解决方案(2)也非常简单。如果库发生变化,您需要重新构建—无论如何,您都需要这样做

    我看不出(3)或(4)是必要的,甚至是需要的。对我来说,这听起来像是为目标(源代码树组织和可维护性)做了很多工作,但我甚至不确定这些选项是否真的满足。事实上,你自己也说过“libkml代码不太可能随着我们应用程序的代码而改变。”


    这些年来我发现的是保持事情简单。如果重建KML可能很耗时,请获取lib并静态链接到库。是的,还有其他依赖项,但您只需设置一次就可以完成,希望以后不再担心。否则,将其粘贴到项目中并继续。我认为值得一提的是,在这个问题上花费大量时间是否值得麻烦。

    键入六个文件名,或使用带有#pragma comment(lib,“foo.lib”)的声明式样式,与将其转换为DLL或COM服务器所需的工作相比,这些工作微不足道

    发行版严重倾向于将其用作静态链接库。只有零散的声明可以将其转换为带有u declspec(dllexport)的DLL。它们仅存在于第三方依赖项中。所有这些都使用不同的#定义,当然,您可以在项目的预处理器定义中键入一组名称

    此外,由于您在COM服务器中使用此DLL,因此在运行时实际加载此DLL将非常困难。当COM创建您的控件实例时,DLL的搜索路径将是客户端应用程序的,不太可能靠近您部署DLL的位置


    使它成为一个COM服务器是一项艰巨的工作,你必须自己编写所有的接口。同样,源代码中没有任何东西可以帮助实现这一点。

    好吧,现在,我实际上已经将所有库指定为依赖项(总共九个:六个
    libkml
    库加上
    zlib
    uriparser
    ,以及
    expat
    ),但是如果我编译的代码实际链接到其中任何一个,整个事情都悄无声息地破裂了。我想,从可维护性的角度来看,它似乎也有问题。@Wyatt:我知道这个问题。我们使用包装DLL,就像我在回答这个问题时所描述的。你能给我指一些相关文档吗?我试图创建一个“包装器”项目,其中有六个单独的项目作为依赖项,输出指定为.DLL,但实际上似乎并没有生成任何内容