Как среда 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-файл.