【问题标题】:How does PATH environment affect my running executable from using msvcr90 to msvcr80?从使用 msvcr90 到 msvcr80,PATH 环境如何影响我正在运行的可执行文件?
【发布时间】:2010-04-26 11:11:16
【问题描述】:
#include <gtk/gtk.h>

int main( int argc, char *argv[] )
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show  (window);

    gtk_main ();

    return 0;
}

我尝试将各种版本的MSVCR80.dll 放在与生成的可执行文件相同的目录下(通过cmake),但没有一个匹配。

这种问题有通用的解决方案吗?

更新

一些答案​​建议安装VS redist,但我不确定它是否会影响我安装的Visual Studio 9,有人可以确认吗?

可执行文件的清单文件

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

清单文件似乎说它应该使用MSVCR90,为什么它总是报告缺少MSVCR80.dll

找到

花了几个小时终于发现是PATH的这个设置引起的:

D:\MATLAB\R2007b\bin\win32

删除后一切正常。但是为什么该设置会影响我正在运行的可执行文件从使用 msvcr90msvcr80 ???

【问题讨论】:

    标签: windows dll cmake msvcrt


    【解决方案1】:

    回答主题问题,即使 gtk 应用程序也需要 Microsoft 库,因为它不会尝试模拟 Windows 小部件的外观和行为。相反,gtk 使用原生 API 来绘制小部件。即使您使用 MinGW 编译器进行编译,您的程序仍然需要 MSVCR。

    尝试查看 makefile 以获得一个想法,为什么 cmake 链接不正确。

    【讨论】:

    • 可以告诉cmake切换到MSVCR90.dll吗?
    【解决方案2】:

    我可以建议您阅读此页面吗? http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F

    简而言之,您需要更改 CMake 文件以静态链接到 MSVC 运行时。

    (顺便说一句,这与 Gtk 无关;默认情况下,每个程序都会链接到 MSVC 运行时)

    【讨论】:

      【解决方案3】:

      您需要VS redist 才能运行它。仅仅在文件夹中放置一个 DLL 是行不通的,因为加载器会查看清单以寻找要满足的依赖项,这些依赖项必须位于 WinSxS 目录中的特定位置。

      这不是链接器问题,只是无法运行生成的 EXE。

      【讨论】:

      • 安装VS redist后还是一样。
      【解决方案4】:

      1.

      也许,CMake 使用外部编译器。在你的情况下 - 它似乎是Microsoft Visual C++ 2005。并且目标可执行文件与 C++ 运行时 dinamycally 链接,这意味着必须在每台运行该程序的计算机上安装 Microsoft Visual C++ 2005 SP1 Redistributable Package (x86) 包。

      MSVCR = MicroSoft Visual C++ Runtime
      

      另见MSDN 文章:/MD, /MT, /LD (Use Run-Time Library)

      2.

      表示 CMake 使用 GCC:How do I use a different compiler?

      3.

      尝试使用Dependency Walker 找出依赖项究竟是如何存在的

      【讨论】:

      • 不,它是用cmake -G"NMake Makefiles" .. 生成的,对我来说似乎是正确的。是否可以告诉 cmake 切换到MSVCR90.dll
      • 它使用nmake作为编译器,这就是我想要的,除了它使用MSVCR80.dll,我安装的cmake自带MSVCR90.dll,那么我怎样才能让它相应地切换呢?
      • @Runner:有点想念你的想法。 nmake 到底有什么用? NMake 是用于 Microsoft VC++ 编译器的 make 应用程序,就像 GNU Make 用于 GNU C/C++ 编译器一样,而 CMake 是通用的。
      • 我首先通过cmake -G"NMake Makefiles" ..nmake 生成了makefile,然后使用nmake 生成了报告缺少MSVCR80.dll 的可执行文件。
      • 据我所知,从 ~buratinas 的回答 cmake 并不意味着在这种情况下,可能你必须配置 gtk 环境?
      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多