文章目录
- EA - 开源工程的编译
- 概述
- 笔记
- 环境
- 备注
- x86版本
- EABase_x86
- EAAssert_x86
- EAThread_x86
- 修改 eathread_atomic_standalone_msvc.h
- 原始
- 修改后
- EAStdC_x86
- EASTL_x86
- EAMain_x86
- EATest_x86
- 备注
- 备注
- END
EA - 开源工程的编译
概述
EA开源了‘命令与征服’的游戏源码
尝试编译.
首先不是尝试编译游戏本身相关的工程,而是将基础代码编译了。否则游戏本身编译不过,缺东西。
笔记
环境
git bash 命令行
加入gnu make (git的用法整理), 看目录项 ‘为git bash 添加 make命令’
不确定编译时,是否需要make, 但是环境已经修改了,就这么着。
编写 my_git_bash.sh,用来带入cmake环境(用VS2019的CMake)
#!/bin/bash# @file my_git_bash.sh# C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>where cmake
# C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe
# export PATH="/c/Program Files/CMake/bin:$PATH"
export PATH="/C/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin:$PATH"# cmake --version
echo "cmake[vs2019] env set ok"
echo "if want to quit the sub shell, input cmd 'exit' to quit"exec bash
进入工程目录
用’git status’查看,是否有不在工程控制内的新文件和目录,有的话就删除。
rm -rf ./out
rm -rf .\build
EA的工程默认是x86的。
用管理员模式运行 git bash.
cd /D/3rd/game_prj
# 引入cmake环境,开sub shell
./my_git_bash.sh
备注
配置工程用的是git bash脚本和命令行,默认生成的工程是x64版本的。
应该是CMake参数要指定是x86还是x64才行。
现在需要编译一个x86的版本出来(EA开放的这些工程都是x86的),必须要在CMake参数中指定生成VS2019x86的工程。
如果不指定c++语言标准,默认都是用最新的实验性标准。
其中有一个工程用最新实验性标准编译不过,必须指定c++语言标准为C++14
cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14
如果不是自己手工调用的git bash 脚本命令行,而是用EA工程自己写好的.sh, 那么该.sh中用的CMake命令行,也需要指定VS2019 x86的参数。
x86版本
EABase_x86
迁出工程到本地
git@github.com:electronicarts/EABase.git
确认在工程源码目录中(如果不在工程目录中,就进入该工程目录)
cd EABase$ pwd
/D/3rd/game_prj/EABase
建立并进入build目录
mkdir ./build && cd ./build# 确认在构建目录中
$ pwd
/D/3rd/game_prj/EABase/build
生成工程文件
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..
编译工程
cmake --build .
安装工程
# 因为编译出来的工程,默认是以Debug方式编译的,所以下面的命令无效
# 需要自己用VS2019工程编译Debug版,然后自己将东西拷贝到自己的库目录
# 打开 ./build/EABase.sln, 编译ALL_BUILD
# 手工将 D:\3rd\game_prj\prj1_EABase\include\Common\EABase 拷贝到 D:\EA_lib
EAAssert_x86
确认进入了工程源码目录
$ pwd
/D/3rd/game_prj/EAAssert
mkdir ./build && cd ./build
# 将 D:\3rd\game_prj\prj5_EASTL\* 中的内容拷贝到 D:\3rd\game_prj\prj2_EAAssert\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..
# 打开./build/EAAssert.sln, 为 EAAssert 工程添加头文件包含路径 D:\EA_lib
# 编译工程# 将 D:\3rd\game_prj\prj2_EAAssert\include\EAAssert 拷贝到 D:\EA_lib
# 将 D:\3rd\game_prj\prj2_EAAssert\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
EAThread_x86
确认进入了工程源码目录
cd /D/3rd/game_prj/EAThread$ pwd
/D/3rd/game_prj/EAThread
mkdir ./build && cd ./buildcmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 打开 ./build/EAThread.sln
修改 eathread_atomic_standalone_msvc.h
将 D:\3rd\game_prj\prj3_EAThread\include\eathread\internal\eathread_atomic_standalone_msvc.h 中的如下代码
原始
#if defined(EA_PROCESSOR_X86)#define _InterlockedExchange64 _InterlockedExchange64_INLINE#define _InterlockedExchangeAdd64 _InterlockedExchangeAdd64_INLINE#define _InterlockedAnd64 _InterlockedAnd64_INLINE#define _InterlockedOr64 _InterlockedOr64_INLINE#define _InterlockedXor64 _InterlockedXor64_INLINE#endif
修改后
// 在文件入口处#if defined(EA_PRAGMA_ONCE_SUPPORTED)#pragma once // Some compilers (e.g. VC++) benefit significantly from using this. We've measured 3-4% build speed improvements in apps as a result.#endif#include <windows.h> // add this for InterlockedXXX// ...// 在 EA_PROCESSOR_X86 存在时, 改为如下函数定义#if defined(EA_PROCESSOR_X86)#define _InterlockedExchange64 InterlockedExchange64#define _InterlockedExchangeAdd64 InterlockedExchangeAdd64#define _InterlockedAnd64 InterlockedAnd64#define _InterlockedOr64 InterlockedOr64#define _InterlockedXor64 InterlockedXor64#endif
编译 ALL_BUILD工程
将 D:\3rd\game_prj\prj3_EAThread\build\Debug* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj3_EAThread\include\eathread 拷贝到
EAStdC_x86
确认进入了工程源码目录
$ pwd
/D/3rd/game_prj/EAStdC
mkdir ./build && cd ./build
# 将 D:\3rd\game_prj\prj5_EASTL\* 拷贝到 D:\3rd\game_prj\prj4_EAStdC\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 打开 ./build/EAStdC.sln,
修改EAStdC工程选项 ,添加头文件包含路径 D:\EA_lib
编译ALL_BUILD工程
将D:\3rd\game_prj\prj4_EAStdC\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj4_EAStdC\include\EAStdC 拷贝到 D:\EA_lib
EASTL_x86
这个工程提供了编辑脚本
D:\3rd\game_prj\EASTL\scripts\build.sh
单步不要运行这个脚本,我们只编译x86Debug版本
确认进入了工程源码目录
cd /D/3rd/game_prj/EASTL$ pwd
/D/3rd/game_prj/EASTL
mkdir ./build && cd ./build
# 在 D:\3rd\game_prj\prj5_EASTL\test\packages 目录下,将其他的EA基础工程都拷贝进去(
2025-03-05 14:29 <DIR> EAAssert
2025-03-05 14:29 <DIR> EABase
2025-03-05 14:29 <DIR> EAMain
2025-03-05 14:29 <DIR> EAStdC
2025-03-05 14:29 <DIR> EATest
2025-03-05 14:29 <DIR> EAThread)
# 下面配置工程时,需要联网,好像也没下载啥,可能就是比对子模块的版本啥的,但是不联网不行。
cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 -DEASTL_BUILD_TESTS:BOOL=OFF -DEASTL_BUILD_BENCHMARK:BOOL=ON# 用VS2019打开 ./build/EASTL.sln
# 编译ALL_BUILD工程
# 将 D:\3rd\game_prj\prj5_EASTL\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
# 将 D:\3rd\game_prj\prj5_EASTL\include\EASTL 拷贝到 D:\EA_lib
EAMain_x86
确认进入了工程源码目录
$ pwd
/D/3rd/game_prj/EAMain
mkdir ./build && cd ./build
# 将 EASTL工程拷贝到 D:\3rd\game_prj\prj6_EAMain\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 用VS2019打开 ./build/EAMain.sln
# 设置 EAMain 工程的头文件包含路径为 D:\EA_lib, 将c++标准改为C++14
# 编译 ALL_BUILD 工程
# 将 D:\3rd\game_prj\prj6_EAMain\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
# 将 D:\3rd\game_prj\prj6_EAMain\include\EAMain 拷贝到 D:\EA_lib
EATest_x86
确认进入了工程源码目录
$ pwd
/D/3rd/game_prj/EATest
mkdir ./build && cd ./build
# 将EASTL拷贝到 D:\3rd\game_prj\prj7_EATest\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..
用VS2019打开 ./build/EATest.sln
# 为 EATest 工程添加头文件路径为 D:\EA_lib
# 编译 ALL_BUILD工程
将 D:\3rd\game_prj\prj7_EATest\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj7_EATest\include\EATest 拷贝到 D:\EA_lib
备注
除了 EABase,只有头文件。
其他的EA基础组件,既有头文件,还有.lib
备注
需要确认所有的工程用VS2019编译时,采用的语言标准都是C++14. 否则多种语言标准生成的.lib混用时,可能有不良影响。
此时,就可以继续编译EA开源的游戏工程本身了,有需要EA_lib头和库的时候,包含进去就行。