4
#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???

4

4 回答 4

1

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

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

于 2010-04-26T13:06:56.563 回答
0

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(使用运行时库)

2.

指示 CMake 使用 GCC:如何使用不同的编译器?

3.

尝试使用Dependency Walker来确定依赖项究竟是如何存在的

于 2010-04-26T13:05:36.393 回答
0

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

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

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

于 2010-04-26T13:15:51.880 回答
0

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

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

于 2010-04-26T13:30:45.250 回答