Как среда PATH влияет на мой исполняемый файл от использования msvcr90 до msvcr80? - PullRequest
4 голосов
/ 26 апреля 2010
#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), но ни одна не соответствовала.

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

UPDATE

В некоторых ответах рекомендуется установить 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 ]

1 голос
/ 26 апреля 2010

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

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

0 голосов
/ 26 апреля 2010

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

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

0 голосов
/ 26 апреля 2010

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

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

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

0 голосов
/ 26 апреля 2010

1.

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

MSVCR = MicroSoft Visual C++ Runtime

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

2.

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

3.

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

...