文章目錄
- 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頭和庫的時候,包含進去就行。