EA - 开源工程的编译

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 ./build

cmake -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头和库的时候,包含进去就行。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值