我在Windows上使用gcc-6.3.0和gcc-gnat-6.3.0在MinGW64(MSYS2)中编译了一个Linux软件。我想组装一个包含所有必要文件的安装程序包或zip文件。目的地机器需要MinGW的哪些部分?
我不想发送完整的MSYS2 / MinGW64,因为它有3 GiB!可执行文件只有10 MiB。
我也不会要求用户安装MSYS2和MinGW64,因为在Windows机器上安装它是一件噩梦。包管理器(pacman)对普通用户不友好/不可用。
修改1:
通常,MinGW64不在我的PATH中。我有一个脚本来添加它取决于所选的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)
我假设,第一个可执行文件ghdl.exe
没问题,因为它只引用了Windows DLL。第二个可执行文件ghdl1-llvm.exe
有四个特殊条目:
libstdc++-6.dll => /c/Program Files/gettext-iconv/libstdc++-6.dll
libgcc_s_sjlj-1.dll => /c/Program Files/gettext-iconv/libgcc_s_sjlj-1.dll
libwinpthread-1.dll => /c/Program Files/gettext-iconv/libwinpthread-1.dll
??? => ???
问题:
我使用ghdl后端编译了llvm,这是用Ada编写的。我希望在Linux上还有两个依赖项:
OTOH,GHDL也有libgrt.a
个文件。如何从该文件中读取依赖项?
编辑2:
哦,我认为编辑中存在绑定错误。
如果我从MinGW64控制台中运行ldd
,我会看到gettext绑定到其他文件......
E.g。 libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
答案 0 :(得分:2)
首先,确保您实际构建的是本机(MinGW)Windows应用程序。您使用的编译器应位于/mingw64/bin/
或/mingw32/bin
。运行which gcc
以确保使用正确的编译器。很多MSYS2问题归结为人们不知道使用哪种编译器,所以我总是提到它。
您需要的DLL由您的程序使用的库及其编译方式确定。所以我不能告诉你你需要什么DLL。相反,我会帮助你自己解决这个问题。
解决这个问题的实验方法是只获取您编译的可执行文件,将其移动到MSYS2之外的其他文件夹,然后双击它来尝试运行它。它可能会抱怨一些DLL丢失。将该DLL从MSYS2(/mingw64/bin
或/mingw32/bin
)内的相应bin目录复制到包含可执行文件的目录中。重复此操作,直到程序成功运行。请注意,我假设MSYS2或具有类似DLL的其他程序不在您的PATH上。您可能希望暂时减少PATH中的文件夹数量,以确保正确执行此操作。例如,您可以在运行set PATH=
后尝试从命令提示符运行程序。
我经常使用的另一种方法是在Dependency Walker中打开我的可执行文件,看看它直接依赖的DLL。
请注意,在极少数情况下,您可能会在运行时加载DLL,而不是在程序启动时加载。我上面提到的方法无法检测到,并且没有通用的机制。
文件libstdc++-6.dll
是GCC的libstdc ++。它实现了C ++标准库,提供了std::string
之类的东西。 “VC ++ 6.0可再发行组件”将是一些微软产品,这是非常不同的。
你的第二个问题不是问题。也许有些库是静态链接的,而不是动态链接的。
我不知道有什么好方法可以读取像libgrt.a
这样的静态库文件的依赖关系。静态库只是一组尚未链接的对象,因此静态库只包含它需要的未定义符号列表,但它不知道哪个共享或静态库最终会提供这些符号。我建议将静态库编译成可执行文件。