Autor Wątek: SDL2 , brakujące dll  (Przeczytany 946 razy)

Offline beermaster

  • Użytkownik

# Kwiecień 19, 2017, 23:06:27
Witam. Program  (w SDL2) uruchamia się na komputerze na którym został napisany , ale na innym woła o pliki dll vcruntime140d.dll, msvcp140d.dll i kilka innych. Czy te pliki trzeba "ręcznie" dodawać do programu , czy coś w ustawieniach projektu trzeba ustawić ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline laggyluk

  • Użytkownik
    • http://laggyluk.com

# Kwiecień 19, 2017, 23:18:29
Zgogluj, to któraś z wersji microsoft visual c++ redistributable które widocznie masz zainstalowane na jednym kompie a na drugim nie

Offline st3tc

  • Użytkownik

# Kwiecień 19, 2017, 23:29:58
DLL-ki z końcówką "d"  (...140d.dll) to runtime w wersji Debug, którego nie wolno dystrybuować z aplikacją. Skompiluj program jako "Release" - użyje poprawnych DLL. 

<xxx>140.dll to DLL-ki z nowego runtime CRT od VS2015/2017. One używają Universal CRT. Można je dodawać do aplikacji ale wtedy należałoby też dodać UCRT.
UCRT pracujące jako "local deployment" pochodzi z Win 10 SDK (wersja min. 14393)

UCRT: %ProgramFiles(x86)%\Windows Kits\10\Redist\ucrt\DLLs\x<86/64>  (wszystkie pliki dla danej wersji Twojego programu: x86 lub x64)
VCRT VS2015: "%VS140COMNTOOLS%..\..\VC\Redist\x<86/64>\Microsoft.VC140.CRT"
VCRT VS2017: %ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.10.25008\x<86/64>"  (aktualnie)

Poprawne UCRT obsługujące local deployment z wersji minimum 14393 SDK. Trochu syfiaste bo teraz trzeba dodawać w sumie ok 43 pliki ale co poradzić ... ;)

// EDIT: Można ofkoz też zainstalować runtime z instalatorka vcredist_x<86/64>.exe (w katalogach VCRT) ale to powyżej jeśli ktoś preferuje np. zip-y bez instalatorów ;)
« Ostatnia zmiana: Kwiecień 19, 2017, 23:34:53 wysłana przez st3tc »

Offline beermaster

  • Użytkownik

# Kwiecień 20, 2017, 00:21:55
Kompiluję na Release , Ale jak uruchamiam to się wysypuje z błędem.

 Aplikacja nie została właściwie uruchomiona (0xc000007b)
 Skompilowane na Debug działa dobrze.

Offline st3tc

  • Użytkownik

  • +1
# Kwiecień 20, 2017, 01:02:51
0xc000007b to błąd 'STATUS_INVALID_IMAGE_FORMAT' - pojawia się np. jak miksujesz złe dll-ki, np. x86 z x64 (ale nie tylko).

1. Zainstaluj sobie Dependency Walker'a : http://www.dependencywalker.com/. Uruchom go jako admin i z menu Options->Configure Handled File Extensions dodaj 'EXE' i 'DLL' - od tego momentu będziesz miał pod RMB opcję 'View Dependencies'

2. Zrób RMB na swoim exe i odpal pod Dep.Walkerem. Jak załaduje zapisz raport z menu File -> Save as (plik *.dwi) i wrzuć do sprawdzenia.

3. Albo wystaw gdzieś ten program żeby można było zassać (nawet na PM podeślij) to się sprawdzi

Offline beermaster

  • Użytkownik

# Kwiecień 20, 2017, 11:29:28
W załączniku zapisany plik.

DependencyWalker na początku też daje błąd i coś takiego pisze:

Error: At least one required implicit or forwarded dependency was not found.
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

Offline st3tc

  • Użytkownik

# Kwiecień 20, 2017, 11:30:07
To jak już jesteś online to wygeneruj jeszcze to :) - Włączysz instrumentację procesu ładowania programu. Mega (!) przydatne przy dziwnych błędach przy odpalaniu programu.

Przejdź do katalogu "%ProgramFiles(x86)%\Windows Kits\10\Debuggers". Powinny być tam podkatalogi x86 i x64, x64 będzie pusty jeśli nie masz zainstalowanych 'Debugging Tools for Windows' w wersji 64bit (32bit/x86 powinno być)
Jeśli nie masz to zainstaluj bo czasem mocno przydatne (https://msdn.microsoft.com/en-us/library/windows/hardware/ff551063(v=vs.85).aspx)

W %ProgramFiles(x86)%\Windows Kits\10\Debuggers\<x86/x64> będziesz miał program o nazwie gflags.exe. Progsik ustawia w rejestrze flagi związane z diagnostyką/debugowaniem itp. Nam się przyda flaga "sls" - "Show Loader Snaps".
Po włączeniu dla Twojego progsa w oknie debugera będzie wyświetlane info diagnostyczne z procesu ladowania apki. Będzie też tam opis dlaczego padło i która dll-ka lub może exe padł.

Z katalogu (...)\Debuggers\<x86/x64> :

1. Włączamy: gflags.exe -i <pełna ścieżka do Twojego programu> +sls
2. Zrzucamy loga:  cdb -G -g <pełna ścieżka do Twojego programu>   >  <katalog docelowy>\loader-log.txt
3. Wyłączamy: gflags.exe -i <pełna ścieżka do Twojego programu> -sls

I wrzuć też tego loga

PS. Jeśli soft jest 64 bitowy to będzie trzeba doinstalować również wersję 64bit debugera albo zrzut zrobić z okna output VS (gflags nie ma znaczenia czy 32 czy 64)

Offline st3tc

  • Użytkownik

# Kwiecień 20, 2017, 11:33:30
Dobra, z flagami już nie trzeba bo widać na załączonym obrazku.
Niemniej warto to powyżej zapamiętać bo czasem ratuje włosy przed wyrwaniem ;)

Zerknij na obrazek - wrzuciłeś przez pomyłkę 64bit dll-kę od SDL-a do katalogu

Offline beermaster

  • Użytkownik

# Kwiecień 20, 2017, 11:51:44
Kurcze taki prosty błąd ... teraz działa. No przynajmniej na kompie na którym piszę. Później sprawdzę jak teraz na innych kompie zadziała.

DZIĘKI :) za pomoc

Offline st3tc

  • Użytkownik

# Kwiecień 20, 2017, 11:58:49
UCRT powinno być już w systemie, bo jest dystrybuowane przez Windows Update (chyba, że ktoś wyłączył to nie ma)
VCRT możesz dodać (VCRUNTIME140.DLL + MSVCP140.DLL)

Największy pewniak to dorzucić do katalogu z programem UCRT i VCRT z lokalizacji które podałem wyżej - wersje x86 dla Twoich fiszek. Poniżej Win10 będą brane i będzie po problemie, na Win10 app-local UCRT zostanie pominięte (traktowane jako komponent systemowy, jest już bankowo w systemie).

Po dodaniu sprawdź Dep.Walkerem czy nie wpadło coś 64 bit