MinGW编译Box2D

Box2D是一个著名的2D物理引擎。网上很多文章是老版本,使用cmake编译,最新的git版本,已经移除了cmake支持,使用premake5编译。本文记录了使用mingw编译该版本的方法。

编译平台:MinGW 5.3.0 32位, Win10x64

编译器信息:

g++ -v

gcc version 5.3.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)

1、下载Box2D源码:

Box2D源码仓库:https://github.com/erincatto/Box2D

2、下载premake5

下载地址:premake5

3、编辑Box2D目录下的premake5.lua

主要有4个部分,

  1. configurations调换两个配置的位置,从而默认创建release版本;
  2. defaultplatform改为x86,因为这里用的是32位版本编译器;
  3. kind 'StaticLib'后面添加两行,创建libBox2D.a的库:
    1
    2
    3
     	kind 'StaticLib'
    + targetextension '.a'
    + targetprefix 'lib'
  4. filter { 'system:windows' }过滤器下,添加两个缺少的库gdi32imm32
1
2
-    	links { 'Box2D', 'opengl32', 'winmm' }
+ links { 'Box2D', 'opengl32', 'winmm', 'gdi32','imm32' }

完整的diff文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
diff --git "a/premake5-a174dba-left.lua" "b/premake5.lua"
index 092eab4..138cc76 100644
--- "a/premake5-a174dba-left.lua"
+++ "b/premake5.lua"
@@ -2,7 +2,7 @@
-- https://premake.github.io/

workspace 'Box2D'
- configurations { 'Debug', 'Release' }
+ configurations { 'Release','Debug' }
startproject 'Testbed'
location 'Build'
symbols 'On'
@@ -15,7 +15,7 @@ workspace 'Box2D'
platforms { 'x86_64' }
filter 'system:windows'
platforms { 'x86', 'x86_64' }
- defaultplatform 'x86_64'
+ defaultplatform 'x86'
defines { '_CRT_SECURE_NO_WARNINGS' }
filter {}

@@ -29,6 +29,8 @@ workspace 'Box2D'

project 'Box2D'
kind 'StaticLib'
+ targetextension '.a'
+ targetprefix 'lib'
files { 'Box2D/**' }
includedirs { '.' }

@@ -79,7 +81,7 @@ project 'Testbed'
'Testbed/glfw/wgl_context.c',
'Testbed/glfw/egl_context.c'
}
- links { 'Box2D', 'opengl32', 'winmm' }
+ links { 'Box2D', 'opengl32', 'winmm', 'gdi32','imm32' }

filter { 'system:macosx' }
files

将上述patch文件保存,使用git自带的patch命令,可以很方便的打补丁,命令如下:

1
$ patch premake5.lua build.patch

3、运行premake5,创建Makefile

可以首先运行premake5 --help,看看支持哪些命令。生成MinGW可编译的Makefile需要使用gmake2参数:

1
2
3
4
5
6
7
8
$ premake5 gmake2
Building configurations...
Running action 'gmake2'...
Generated Build/Makefile...
Generated Build/Box2D.make...
Generated Build/HelloWorld.make...
Generated Build/Testbed.make...
Done (247ms).

4、修改Testbed.make

进入Build目录,打开Testbed.make,在文件开始处前添加CC=gcc,注意CC需要大写

1
2
3
# ------注意增加这一句------
CC=gcc

5、保存,开始编译

1
mingw32-make

6、运行

Build\bin\x86\Release目录下找到Testbed.exe,运行后,在Test中选择Tumbler,可以看到一个旋转的矩形,编译完成。

7、安装

新建安装目录Box2D/Box2D\include/Box2d\lib,将.h文件复制到include目录下,.a文件复制到lib目录下,批处理文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
set BUILD_CONFIG=Release
set PLATFORM=x86
set IGNORED=ignored.txt

mkdir %~dp0.\Box2d %~dp0.\Box2D\include %~dp0.\Box2D\lib %~dp0.\Box2D\bin
rem echo %~dp0
echo .cpp>%IGNORED%

xcopy %~dp0..\Box2D %~dp0.\Box2D\include /E /EXCLUDE:%IGNORED% /Y
copy %~dp0.\bin\%PLATFORM%\%BUILD_CONFIG%\libBox2D.a %~dp0.\Box2D\lib\ /Y
copy %~dp0.\bin\%PLATFORM%\%BUILD_CONFIG%\*.exe %~dp0.\Box2D\bin\ /Y
del %IGNORED%

@echo on