EA - 开源工程的编译

server/2025/3/6 18:47:52/

文章目录

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

END


http://www.ppmy.cn/server/172943.html

相关文章

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述&#xff1a; 当自定义日志输出格式&#xff0c;需要输出http请求中url参数时&#xff0c;如果参数中包含中文&#xff0c;是会进行url encode的&#xff0c…

Stable Diffusion LoRA 技术详解

Stable Diffusion LoRA 技术详解 一、LoRA 技术原理 低秩矩阵分解 LoRA&#xff08;Low-Rank Adaptation&#xff09;通过冻结 Stable Diffusion&#xff08;SD&#xff09;基础模型权重&#xff0c;在交叉注意力层&#xff08;Cross-Attention Layer&#xff09;中注入可训练…

js的继承你了解多少

实现继承的方式有很多&#xff0c;下面我们来写常用的几种&#xff08;包括但不限于原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承&#xff09;&#xff1a; 原型链继承 原型链继承通过修改子类的原型为父类的实例&#xff0c;从而实现子类可以访问到父类构造函…

Flink事件时间和处理时间咋区分

Flink事件时间和处理时间咋区分&#xff1f;小白也能懂&#x1f609; 嘿&#xff0c;各位小伙伴&#xff01;今天咱们来聊聊Flink里事件时间和处理时间这俩让人有点迷糊的概念&#x1f9d0; 别担心&#xff0c;我会尽量用通俗易懂的方式给大家讲清楚&#xff0c;就像咱们平时聊…

RabbitMQ的四种交换机

RabbitMQ交换机 什么是RabbitMQ RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用于在分布式系统中存储和转发消息。它基于 AMQP&#xff08;高级消息队列协议&#xff09;实现&#xff0c;支持多种消息传递模式&#xff0c;广泛应用于异步通信、应用解耦、负载均衡…

API返回的数据格式是怎样的?

根据搜索结果&#xff0c;以下是1688按图搜索商品&#xff08;拍立淘&#xff09;API返回的数据格式的详细说明&#xff1a; API返回的数据格式 1688按图搜索商品&#xff08;拍立淘&#xff09;API返回的数据通常是一个JSON格式的响应&#xff0c;其结构如下&#xff1a; {&…

从0搭建Tomcat第二天:深入理解Servlet容器与反射机制

在上一篇博客中&#xff0c;我们从0开始搭建了一个简易的Tomcat服务器&#xff0c;并实现了基本的HTTP请求处理。今天&#xff0c;我们将继续深入探讨Tomcat的核心组件之一——Servlet容器&#xff0c;并介绍如何使用反射机制动态加载和管理Servlet。 1. Servlet容器的作用 S…

第六节:基于Winform框架的串口助手小项目---收发数据《C#编程》

1.目标&#xff1a;实现数据的收发 2.代码演示 根据控件编程 &#xff08;1&#xff09;接收配置 自动清空 private void autoclear_chb_CheckedChanged(object sender, EventArgs e) {if (autoclear_chb.Checked){timer1.Start();}else{timer1.Stop();} } 手动清空 privat…