Lỗi khi mở file .exe

Chào mọi người. Mình gặp vấn đề khi build một project SFML trên Code Blocks thì vẫn được nhưng khi mở file .exe trong thư mục Debug thì nó báo lỗi “the code execution cannot proceed because libstd++6-dll / libgcc-s-sjlj-1-dll was not found”. Mình search lỗi trên stackoverflow là thêm -static-libgcc -static-libstdc++ trong linker setting nhưng mà vẫn không được. Thử copy 2 dll vào cùng thư mục với file exe thì chạy nó lại báo một lỗi khác “The procedure entry point…”. Ai biết fix như nào k ạ. cảm ơn mọi người

nếu có install MSVC thì xài dumpbin /dependents <tên-file> nó sẽ in ra ví dụ

Dump of file pmg.exe

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    libfmt.dll
    libsfml-graphics-2.dll
    libsfml-system-2.dll
    libsfml-window-2.dll
    KERNEL32.dll
    msvcrt.dll
    OPENGL32.dll
    USER32.dll
    libgcc_s_seh-1.dll
    libstdc++-6.dll

Mấy cái có tên in hoa hay msvcrt.dll là Windows có sẵn rồi, còn lại nó sẽ cần 6 cái DLL: libfmt.dll, libsfml-graphics-2.dll, libsfml-system-2.dll, libsfml-window-2.dll, libgcc_s_seh-1.dll, libstdc+±6.dll. Copy 5 cái DLL này vào cùng thư mục, rồi chạy tiếp dumpbin /dependents cho từng DLL :V ví dụ dumpbin /dependents libsfml-graphics-2.dll v.v… :V


cách thứ 2 dễ hơn là xài 1 cái dependencies walker nào đó :V Ví dụ cái này: https://github.com/lucasg/Dependencies. Bấm vô cái “Download here” down về giải nén ra:
image

rồi mở DependenciesGui.exe lên (chờ hơi lâu), rồi Ctrl+O mở file .exe cần dò dependencies lên:

tha hồ mà vọc :V Chú ý những file dll ví dụ như libgcc_s_seh-1.dll có thể bị nhầm qua dll của các chương trình khác, phải coi kĩ đường dẫn của nó rồi copy lại cho đúng. Ví dụ sau khi copy 6 cái dll phù hợp vào:

image

rồi bấm F5 bên DependenciesGui.exe:
image

thấy nó nhận đúng đường dẫn tới 6 file DLL kia là được. Rồi coi tiếp dependencies của 6 file dll đó (bấm vô dấu mũi tên màu trắng bên trái tên file) ví dụ libstdc+±6.dll và libgcc_s_seh-1.dll:
image

thì ta thấy libgcc_s_seh-1.dll phụ thuộc vào libstdc+±6.dll, cả 2 dll này đều phụ thuộc vào libwinpthread-1.dll nữa, mà đang lấy nhầm bên pdf2svg, ta cần copy libwinpthread-1.dll bên trình biên dịch mà ta xài biên dịch cho file exe của ta lại cho đúng.

sau đó tiếp tục tìm với các libsfml-???-2.dll còn lại:
image

mừng quá thấy đủ rồi thì dừng :V Thật ra ở đây có thể libsfml-graphics-2.dll thiếu libfreetype-6.dll
image
, ko biết tại sao trong system32 của mình lại có sẵn :V :V :V Nếu mình muốn copy lại cho đúng hàng, nhỡ system32 của máy khác ko có, thì phải dò tiếp dependencies của libfreetype-6.dll vừa copy vào:
image
ta lại thấy cần libbz2-1.dll, libharfbuzz-0.dll, libpng16-16.dll, zlib1.dll. Cái libpng và zlib tuy có sẵn trong system32 nhưng 1 lần nữa nó có thể ko khớp 100% với binary của ta, copy luôn :V :V (của mình là từ H:\msys2_64\mingw64\bin)

á ớ còn quên check dependencies của libharfbuzz, nó lệ thuộc thêm graphite, glib gì đó :V :V glib lại lệ thuộc libintl và pcre, libintl lại lệ thuộc libiconv :V Welcome to dependency hell tầng 1 :V :V :V

kết quả cuối cuối cùng
image

:V


cách thứ 3 dễ nhất là xài VS Community 2017/2019 + vcpkg và CMake. Nếu config đúng thì khi compile VS nó sẽ copy sẵn những dll cần thiết luôn:
image

cái này dài dòng thôi xài cái dependencies walker kia mò từ từ đi :V :V

đầu tiên là install VS Community 2017
kế tiếp là install Git
kế tiếp là install CMake
kế tiếp là vào thư mục ví dụ C:\src chẳng hạn rồi gõ git clone https://github.com/Microsoft/vcpkg
kế tiếp là cd vcpkg, mở Admin console lên rồi gõ vcpkg integrate install
mở lại console thường, vào thư mục vcpkg, gõ vcpkg install sfml (nếu muốn install cho x64 thì gõ vcpkg install sfml:x64-windows)
mở VS Community lên, tạo project mới và xài vô tư :V :V :V Hoặc tạo 1 cái CmakeLists.txt rồi viết config vào v.v…

4 Likes


Mình thử cách 1 sao nó lại không báo phụ thuộc 2 cái thư viện không tìm thấy kia nhỉ

tại vì bạn xài static link gcc/g++ rồi :V

có VS 2017 thì còn xài CodeBlocks làm gì nữa, git clone vcpkg mà táng thôi :V

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?