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
Lỗi khi mở file .exe
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:
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:
rồi bấm F5 bên DependenciesGui.exe
:
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:
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:
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
, 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:
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
: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:
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…
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