Как среда PATH влияет на мой исполняемый файл от использования msvcr90 до msvcr80?

#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), но ни один не совпал.

Есть ли общее решение для такой проблемы?

ОБНОВИТЬ

В некоторых ответах рекомендуется установить Redist VS, но я не уверен, повлияет ли это на мою установленную 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

После удаления все работает нормально. Но почему этот параметр может повлиять на мой исполняемый файл с использованием msvcr90 до msvcr80???

4 ответа

Отвечая на вопрос темы, даже приложению gtk нужны библиотеки Microsoft, поскольку оно не пытается эмулировать внешний вид и поведение виджетов Windows. Вместо этого gtk использует собственные API для рисования виджетов. Даже если вы скомпилируете с помощью MinGW-компилятора, вашей программе все равно потребуется MSVCR.

Попробуйте заглянуть в make-файлы, чтобы понять, почему cmake не соединяется должным образом.

Могу ли я предложить вам прочитать эту страницу? http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F

Короче говоря, вам нужно изменить файл CMake, чтобы он статически связывался со средой выполнения MSVC.

(Кстати, это не имеет ничего общего с Gtk; каждая программа по умолчанию будет связана с средой выполнения MSVC)

1.

Может быть, CMake использует внешний компилятор. В твоем случае - похоже Microsoft Visual C++ 2005, И целевой исполняемый файл связан со средой выполнения C++ dinamycally что означает, что пакеты Microsoft Visual C++ 2005 SP1 Redistributable Package (x86) должны быть установлены на каждом компьютере, на котором выполняется программа.

MSVCR = MicroSoft Visual C++ Runtime

Смотрите также это MSDN article: / MD, / MT, / LD (использование библиотеки времени выполнения)

2.

Чтобы указать CMake, используйте GCC: Как мне использовать другой компилятор?

3.

Попробуйте использовать Dependency Walker, чтобы выяснить, как именно существует зависимость

Вам нужно переадресации VS для его запуска. Простое размещение DLL в папке не будет работать, так как загрузчик просматривает манифест для удовлетворения зависимостей, которые должны находиться в определенном месте в каталоге WinSxS.

Это не проблема компоновщика, вы просто не можете запустить созданный вами EXE-файл.

Другие вопросы по тегам