Pae*_*els 1 windows installation package mingw-w64 msys2
我用 gcc-6.3.0 和 gcc-gnat-6.3.0 在 Windows 上的 MinGW64 (MSYS2) 中编译了一个 Linux 软件。我想组装一个安装程序包或 zip 文件,其中包含所有必需的文件。目标机器需要 MinGW 的哪些部分?
我不想发送完整的 MSYS2/MinGW64,因为它有 3 GiB!可执行文件只有 10 MiB。
我也不会要求用户安装MSYS2和MinGW64,因为在Windows机器上安装它是一场噩梦。包管理器(pacman)对普通用户来说不友好/不可用。
编辑1:
通常,MinGW64 不在我的路径中。我有一个脚本来根据所选的 MinGW 版本 32 与 64 添加它。用于编译程序的 GCC 来自 mingw32 或 mingw64 目录。
我将二进制文件复制到一个单独的目录:C:\Tools\GHDL\0.34dev-mingw64-llvm\bin
我曾经ldd.exe检查可执行文件:
C:\msys64\usr\bin\ldd.exe C:\Tools\GHDL\0.34dev-mingw64-llvm\bin\ghdl.exe
ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77020000)
kernel32.dll => /c/Windows/system32/kernel32.dll (0x76f00000)
KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcf20000)
ADVAPI32.dll => /c/Windows/system32/ADVAPI32.dll (0x7fefd6a0000)
msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefd130000)
sechost.dll => /c/Windows/SYSTEM32/sechost.dll (0x7feff310000)
RPCRT4.dll => /c/Windows/system32/RPCRT4.dll (0x7fefe450000)
SHELL32.dll => /c/Windows/system32/SHELL32.dll (0x7fefe580000)
SHLWAPI.dll => /c/Windows/system32/SHLWAPI.dll (0x7fefe120000)
GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefda60000)
USER32.dll => /c/Windows/system32/USER32.dll (0x76e00000)
LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd110000)
USP10.dll => /c/Windows/system32/USP10.dll (0x7fefd5d0000)
C:\msys64\usr\bin\ldd.exe C:\Tools\GHDL\0.34dev-mingw64-llvm\bin\ghdl1-llvm.exe
ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77020000)
kernel32.dll => /c/Windows/system32/kernel32.dll (0x76f00000)
KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcf20000)
??? => ??? (0x6fe40000)
libstdc++-6.dll => /c/Program Files/gettext-iconv/libstdc++-6.dll (0x6fc40000)
libgcc_s_sjlj-1.dll => /c/Program Files/gettext-iconv/libgcc_s_sjlj-1.dll (0x6cec0000)
msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefd130000)
libwinpthread-1.dll => /c/Program Files/gettext-iconv/libwinpthread-1.dll (0x64940000)
USER32.dll => /c/Windows/system32/USER32.dll (0x76e00000)
GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefda60000)
LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd110000)
USP10.dll => /c/Windows/system32/USP10.dll (0x7fefd5d0000)
Run Code Online (Sandbox Code Playgroud)
我认为第一个可执行文件ghdl.exe没问题,因为它仅引用 Windows DLL。第二个可执行文件ghdl1-llvm.exe有四个特殊条目:
libstdc++-6.dll => /c/Program Files/gettext-iconv/libstdc++-6.dlllibgcc_s_sjlj-1.dll => /c/Program Files/gettext-iconv/libgcc_s_sjlj-1.dlllibwinpthread-1.dll => /c/Program Files/gettext-iconv/libwinpthread-1.dll??? => ???问题:
我编译了ghdl,它是用 Ada 编写的,带有llvm后端。我希望还有两个像 Linux 上的依赖项:
OTOH,GHDL 也有一个libgrt.a文件。如何从该文件中读取依赖项?
编辑2:
哦,我认为编辑 1 中存在绑定错误。
如果我ldd从 MinGW64 控制台中运行,我会看到 gettext 绑定到其他文件...
例如libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
首先,确保您实际上正在构建本机 (MinGW) Windows 应用程序。您使用的编译器应位于/mingw64/bin/或中/mingw32/bin。运行which gcc以确保您使用正确的编译器。许多 MSYS2 问题都归结为人们不知道使用哪个编译器,所以我总是提到它。
您需要的 DLL 取决于您的程序使用的库以及编译方式。所以我不能只告诉您您需要哪些 DLL。相反,我会帮助你自己解决这个问题。
解决这个问题的实验方法是获取您编译的可执行文件,将其移动到 MSYS2 之外的其他文件夹,然后尝试通过双击来运行它。它可能会抱怨缺少某些 DLL。/mingw64/bin将该 DLL 从 MSYS2(或)内相应的 bin 目录复制/mingw32/bin到包含可执行文件的目录中。重复此操作,直到程序成功运行。请注意,我假设 MSYS2 或其他具有类似 DLL 的程序不在您的 PATH 上。您可能需要暂时减少 PATH 中的文件夹数量,以确保正确执行此操作。例如,您可以尝试在运行后从命令提示符运行该程序set PATH=。
我经常使用的另一种方法是在Dependency Walker中打开可执行文件并查看它直接依赖于哪些 DLL。
请注意,在极少数情况下,您可能会在运行时而不是在程序启动时加载 DLL。我上面提到的方法无法检测到这一点,并且没有通用的机制可以做到这一点。
该文件libstdc++-6.dll是GCC的libstdc++。它实现了 C++ 标准库,提供诸如std::string. “VC++ 6.0 Redistributable”可能是微软的一些产品,这是非常不同的。
你的第二个问题不是一个问题。也许某些库是静态链接而不是动态链接。
我不知道有什么好方法来读取静态库文件(如libgrt.a. 静态库只是一组尚未链接的对象,因此静态库仅具有所需的未定义符号列表,但它不知道哪个共享库或静态库最终将提供这些符号。我建议将静态库编译成可执行文件。
| 归档时间: |
|
| 查看次数: |
3614 次 |
| 最近记录: |