对不起长的职位,如下所述。

我知道,这不是一个好主意混合的静态联系和动态相联系的C和C++运行时提供的。我们的应用程序的工作已经混合他们的不幸的是,我们一直在试图解决这个问题。由于各种原因(其中不熟悉MSI,事实上,我们使用国家统计局,这也许并不支持MSMs嗯,缺乏时间和资源),我们决定链接的皇家遥感中心而不是静态的动态。我知道原因为什么这不是一个好想法但是这是我们的选择。


我们的代码是主要标准C++的补充,相当多的其它公开来源的图书馆。

该结构应用是:各种模块,结果在静态的图书馆,它自己是连在一起,以创建各种各样的东西之中哪一个可执行的,是给我们的问题。

在释放我们建立的所有 我们 代码/吨。一些开放源图书馆,我们使用预先编译的二进制文件和他们中的一些人dll用预先编译/MD这使我们组合的运行时。因此,我们重新编译那些自己/MT和使他们结果的静态图书馆不dll。这种转换不是为每个图书馆,所以我们还是链接与一些dll使用/MD。


结果是,现在在depends.exe 我们所有的东西 除了一个可执行 不不 直接 取决于msvcr80.dll 或msvcp80.dll.通过 并不直接取决于 我的意思是msvcr80.dll 是不是一个孩子的树的根示depends.exe.有时候我们找到msvcr80.dll 拉在通过一个图书馆dll但是,一些级别更深的树。

我要如何找出为什么msvcr80.dll 在第一级为一个讨厌的可执行的?什么使得可执行的直接链接到msvcr80.dll?

其中一个原因也许是,我们的链接,静态地图书馆的链接使用/MD使它动态与CRT。这样的代码图书馆的一个结束在我们的可执行所以我们可执行的链接msvcr80.dll.但我怎么找出哪一个图书馆做的?


我尝试迄今为止:

  • 负载的静态相联系。lib文件depends.exe ->不工作自从depends.exe 预计,一个可执行或dll不是一个静态的图书馆
  • 使用dumpbin.exe /指令的静态相联系。lib文件>他们没有表明msvcrt80.dll (虽然在调试,我们在那里试着使用/MDd用于一切,他们没有表演msvcrt80d.dll 这使我想到的方法是好的,它证明所有静态相联系的开放源图书馆编制的正确与/吨)
  • 使用/详细:LIB连接标志->它表明,事实上它拉在msvcrt.lib其进图书馆msvcr80.dll 所以我们就麻烦了,但它没有说为什么这样做
  • 使用/详细连接标志+在Visual Studio:其他依赖关系libcmt.lib+忽略所有缺省图书馆是+忽略特定的图书馆:msvcrt.lib在一个绝望的尝试使msvcrt.lib走或者看见谁拉它。结果难倒我
    Searching C:\Program Files\Microsoft Visual Studio 8\VC\lib\msvcrt.lib:  
      Found "public: virtual void * __thiscall type_info::`vector deleting destructor'(unsigned int)" (??_Etype_info@@UAEPAXI@Z)  
        Referenced in libcmt.lib(typinfo.obj)  
        Loaded msvcrt.lib(ti_inst.obj)  
            msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in libcmt.lib(typinfo.obj)  
            msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in libcmt.lib(typinfo.obj)  
      Found "void __stdcall `eh vector destructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *))" (??_M@YGXPAXIHP6EX0@Z@Z)  
        Referenced in msvcrt.lib(ti_inst.obj)
        Loaded msvcrt.lib(ehvecdtr.obj)

因为我了解,typinfo.obj在libcmt.lib引用一个符号,搜索它在msvcrt.lib和之后发现在ti_inst.obj它抛出一个错误,它的定义的两倍。但是,这并不意义。如果libcmt.lib已经具有象征为什么它不会最终在寻找在msvcrt.lib和因此带来msvcr80.dll 我可执行的?和更多一般来说,为什么要的静态图书馆搜索符号中的动态进图书馆?为什么连接甚至看msvcrt.lib如果我有它在该忽略具体的图书馆?

感谢您的耐心:-).

有帮助吗?

解决方案

我解决我的问题。这是一个愚蠢的错误左有从远古时代的可能。

msvcrt.lib是明确提及通过我们在其他依赖关系框:-(所当然,它作出的dll依赖性。和因为所有的开放源库,有一个很大的文本,所以我们没有注意到它。说实话我们甚至不想看着那个盒子小心,因为我们没有想象一下,有可能是这样一个严重错误,在我们的项目。

其他提示

打开你的可执行与depends.exe 和运行分析器建成依赖。我相信这将记录为什么所有dll装,并从他们在那里装载。见"日志LoadLibrary功能的电话"的选项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top