mingw 分 mingw64 和 mingw32
注意下载mingw64 不管是编译64位还是32位程序
关于mingw64下载
MinGw64 :下载posix版,win32版本使用不了 STL标准库的thread/mutex/condition_variable,只能使用win32的线程库
注意 msvcrt和ucrt区别,一般下载msvcrt版本
编译64 位程序下载名字中带有seh的版本
若有编译 32 位程序的需求 下载 名字中带有sjlj版本 sjlj版本官网只更新到 12.1.0
下载32位版本还需要下载32位版本的gdb用于调试程序
所以一般下载的安装包名字大概是以下这样:
x86_64-13.1.0-release-posix-seh-msvcrt-rt_v11-rev1.7z
mingw64下载地址:
mingw64github
mingw64官网
gdb官网
编译32 位程序注意事项 :
- 需要用到mingw64/x86_64-w64-mingw32/lib32目录下的32位动态链接库
编译好的程序通过dependence类的软件查看动态链接库依赖关系后将相应动态库放到程序同一目录下 - 若需要调试需要去gdb官网下载32位gdb放到mingw64/bin目录下,可以替换原来的64位gdb或者在vscode的launch.json的"miDebuggerPath’字段为32位gdb路径
关于编译时注意事项
- 编译好的程序无法打开多半是缺少动态链接库,去mingw64/bin/下寻找缺少的动态库
- 链接时不要包含系统库路径,如c:/System32/winmm.dll ,mingw64编译时链接的是自己的libwinmm.a 库 包含了系统库路径是不行的
- 若要编译动态链接库需要在gcc 编译选项中加上 “ -Wl,–kill-at ” 去掉导出函数名字末尾的@nn
摆脱libwinpthread、libgcc_s_seh、libstdc++依赖
- 若不想编译好的库带上 mingw的动态库 就需要静态链接他们
以下提供几种方法
cmake中 ,亲测可行:
target_link_libraries (your_library -static gcc stdc++ winpthread -dynamic)
gcc命令中加上(网上方法,对我的程序不起作用):
-static-libstdc++ -static-libgcc -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive -Wl,-Bdynamic