ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

EASTL 项目集成指南:通过 CMake 与 Visual Studio 将 EASTL 接入自有工程

EASTL 项目集成指南:通过 CMake 与 Visual Studio 将 EASTL 接入自有工程 开发工具【免费下载链接】EASTLEASTL stands for Electronic Arts Standard Template Library. It is an extensive and robust implementation that has an emphasis on high performance.项目地址https://gitcode.com/gh_mirrors/ea/EASTL点击查看免费下载本文以 EASTL 仓库中的官方集成文档 EASTL_Project_Integration.md 为核心骨架系统讲解如何把 Electronic Arts Standard Template LibraryEASTL接入你自己的 C 工程既覆盖 CMake 与 Visual Studio 两种主流构建方式的完整配置步骤也深入解释其背后“必须自定义operator new[]重载”的机制与底层分配器源码实现并补充当前开源仓库的现代 CMake 用法帮助你在一份可复制、可运行的配置上获得 EASTL 的全部收益。一、背景EASTL 是什么根据 README.md 的说明EASTL 是 Electronic Arts 出品的高性能 C 模板库提供容器、算法与迭代器适用于跨平台的运行时与工具开发其设计第一原则是性能优先。对已经熟悉标准库的开发者而言接入 EASTL 的成本很低——接口形态与 STL 高度一致但底层实现如分配器、内存管理、调试信息传递带有明显的游戏/运行时引擎色彩因此“如何把 EASTL 正确地编进自己的工程”是一道独立的配置题也正是 doc/CMake/EASTL_Project_Integration.md 这篇文档要解决的问题。二、使用 CMake 集成官方文档给出的经典做法是先定义一个根目录变量EASTL_ROOT_DIR然后手动把 EASTL 头文件及其依赖库的头文件目录全部加进 include 路径最后把编译好的静态库链接进目标工程。2.1 在 CMakeLists.txt 中配置set(EASTL_ROOT_DIR C:/EASTL) include_directories (${EASTL_ROOT_DIR}/include) include_directories (${EASTL_ROOT_DIR}/test/packages/EAAssert/include) include_directories (${EASTL_ROOT_DIR}/test/packages/EABase/include/Common) include_directories (${EASTL_ROOT_DIR}/test/packages/EAMain/include) include_directories (${EASTL_ROOT_DIR}/test/packages/EAStdC/include) include_directories (${EASTL_ROOT_DIR}/test/packages/EATest/include) include_directories (${EASTL_ROOT_DIR}/test/packages/EAThread/include) set(EASTL_LIBRARY debug ${EASTL_ROOT_DIR}/build/Debug/EASTL.lib optimized ${EASTL_ROOT_DIR}/build/Release/EASTL.lib) add_custom_target(NatVis SOURCES ${EASTL_ROOT_DIR}/doc/EASTL.natvis)target_link_libraries(... ${EASTL_LIBRARY})要点说明${EASTL_ROOT_DIR}是你存放 EASTL 源码的文件夹文档建议可以把它做成环境变量以便复用。test/packages/...系列路径对应 EASTL 依赖的 EA 配套库头文件EAAssert、EABase、EAMain、EAStdC、EATest、EAThread。需要注意的是在当前开源仓库快照中test/目录下只有source/与 test/CMakeLists.txt并不存在test/packages/目录这些路径源于 EA 内部/历史布局。对于当前开源版本官方推荐直接使用仓库自带 CMake 工程见 2.3 节由构建系统自动解析依赖。EASTL_LIBRARY使用了 CMake 的debug/optimized关键字Debug 配置链接build/Debug/EASTL.libRelease 配置链接build/Release/EASTL.lib。add_custom_target(NatVis ...)只是把 doc/EASTL.natvis 挂进工程VS 专属详见下文 natvis 一节并非 EASTL 运行所必需。2.2 验证配置是否生效配置完成后你可以在目标代码中直接使用 EASTL 容器并做一次最简单的可用性验证#include EASTL/vector.h #include EASTL/string.h #include cstdio int main() { eastl::vectorint v {1, 2, 3}; eastl::string s EASTL integrated; std::printf(%s, size%zu\n, s.c_str(), v.size()); return 0; }如果编译通过并正确打印输出说明 include 路径、库链接与operator new[]重载见第四节都已就绪。2.3 更现代的接入方式直接用仓库 CMake 工程当前开源仓库自带一套完整的 CMakeLists.txt相比文档中的手写 include 路径方式它把依赖管理交给 CMake 完成接入更省事。仓库顶层 CMakeLists 中与本主题直接相关的关键点库目标add_library(EASTL ${EASTL_SOURCES} ${EASTL_HEADERS})即直接编译source/*.cpp生成 EASTL 库。头文件导出target_include_directories(EASTL PUBLIC include)意味着链接 EASTL 的目标会自动获得include/头文件搜索路径无需手工include_directories。标准要求target_compile_features(EASTL PUBLIC cxx_std_14)即库对外公开要求 C14 或更高scripts/CMake/CommonCppFlags.cmake 还会按编译器把标准提升到 C17 或/std:clatestMSVC因此使用方至少应保证 C14 编译环境。依赖解析通过FetchContent拉取 EABase 并target_link_libraries(EASTL EABase)详见 CMakeLists.txt这解释了为什么需要 EA 配套库以及当前开源版不再依赖test/packages/目录。可选开关EASTL_BUILD_BENCHMARK、EASTL_BUILD_TESTS分别控制是否构建 benchmark/ 与 test/EASTL_STD_ITERATOR_CATEGORY_ENABLED控制与std::迭代器类别的兼容开启后定义EASTL_STD_ITERATOR_CATEGORY_ENABLED1。平台相关宏构建时默认定义-D_CHAR16T、-D_CRT_SECURE_NO_WARNINGS、-D_SCL_SECURE_NO_WARNINGS、-DEASTL_OPENSOURCE1其中EASTL_OPENSOURCE1表示使用公开可用技术配置见 include/EASTL/internal/config.h。natvis 集成仅当编译器为 MSVC 时会把 doc/EASTL.natvis 以INTERFACE源文件的方式挂到 EASTL 目标上见 CMakeLists.txt让 VS 调试器自动加载。因此若你希望以“源码引用 FetchContent”方式接入可以这样写include(FetchContent) FetchContent_Declare( EASTL GIT_REPOSITORY EASTL 仓库地址 GIT_TAG 期望的版本 ) FetchContent_MakeAvailable(EASTL) target_link_libraries(my_target PRIVATE EASTL)三、使用 Visual Studio 集成如果你不打算引入 CMake而是直接创建/编辑.vcxproj工程则需要按以下四个步骤手动配置。所有示例中的${EASTL_ROOT_DIR}都是 EASTL 所在文件夹建议为它创建一个环境变量。3.1 添加 include 路径在C/C - General - Additional Include Directories中加入${EASTL_ROOT_DIR}/include ${EASTL_ROOT_DIR}/test/packages/EAAssert/include ${EASTL_ROOT_DIR}/test/packages/EABase/include/Common ${EASTL_ROOT_DIR}/test/packages/EAMain/include) ${EASTL_ROOT_DIR}/test/packages/EAStdC/include) ${EASTL_ROOT_DIR}/test/packages/EATest/include) ${EASTL_ROOT_DIR}/test/packages/EAThread/include)原文档此段存在少量多余括号实际按路径填写即可。与 CMake 一节同理test/packages路径针对依赖配套库开源快照下需要依据你的实际依赖布局调整。3.2 添加库路径在Linker - General - Additional Library Directories中加入${EASTL_ROOT_DIR}/build/$(Configuration)其中$(Configuration)是 VS 内建宏会自动展开为当前活动配置Debug/Release从而找到对应配置下编译出的EASTL.lib。3.3 添加库依赖二选一即可在Linker - Input - Additional Dependencies中加入EASTL.lib或在代码中直接使用链接指令#pragma comment(lib, EASTL.lib)#pragma comment(lib, ...)方式对团队成员更友好依赖声明跟随源码、不会因工程文件差异而丢失。3.4 添加 natvis可选但强烈推荐将 natvis 文件加入工程后调试器会为 EASTL 数据类型加载自定义可视化器能显著改善调试体验——你可以直接以容器语义查看eastl::vector、eastl::string、eastl::map等内容而不是看一堆裸指针。操作方式右键工程 - Add - Existing item选择${EASTL_ROOT_DIR}/doc/EASTL.natvis文件对应仓库中的 doc/EASTL.natvis。由于它只是调试可视化描述对发布构建没有影响属于纯开发期收益。也可参考 2.1 节用add_custom_target(NatVis ...)把它并入 CMake 工程。四、代码准备重载operator new[]这是 EASTL 集成中最容易踩坑、也最容易被忽略的一步。EASTL 要求使用方提供带调试参数的operator new[]重载。官方文档给出的最小实现直接转发给全局new[]void* __cdecl operator new[](size_t size, const char* name, int flags, unsigned debugFlags, const char* file, int line) { return new uint8_t[size]; }4.1 为什么必须提供这个重载从源码看EASTL 的默认分配器会通过“带参数的 placement new 形式”申请内存include/EASTL/allocator.h 在!EASTL_DLL即作为普通静态库而非 DLL 构建时声明了两种带调试参数的重载operator new[](size_t size, const char* pName, int flags, unsigned debugFlags, const char* file, int line)operator new[](size_t size, size_t alignment, size_t alignmentOffset, const char* pName, int flags, unsigned debugFlags, const char* file, int line)对齐版本include/EASTL/allocator.h 中eastl::allocator::allocate()依据EASTL_DEBUGPARAMS_LEVEL选择不同的 placement new 调用例如最完整的形式为::new(pName, flags, 0, __FILE__, __LINE__) char[n]即把调试名、分配标志、文件名与行号一并传给operator new[]。include/EASTL/core_allocator.h 中的EASTLCoreAllocatorImpl同样直接调用这些重载::operator new[](size, name, flags, 0, __FILE__, __LINE__)。也就是说这些重载是默认分配器正常工作所必需的符号如果缺失链接时会报出无法解析的operator new[]错误。4.2 各参数的含义与调试级别name分配的内存调试名默认来自EASTL_ALLOCATOR_DEFAULT_NAME即 config.h 中定义的EASTL见 include/EASTL/internal/config.h。flags分配标志可参考 include/EASTL/allocator.h 中的alloc_flagsMEM_TEMP、MEM_PERM。debugFlags调试标志。file/line调用点文件与行号用于内存跟踪。传递多少调试信息由EASTL_DEBUGPARAMS_LEVEL控制见 include/EASTL/internal/config.h调试构建EA_DEBUG下默认为 2会携带name/file/line完整信息非调试构建默认 0调用参数被置空。这意味着你的重载实现必须对“参数全空”的情况也能正确处理。4.3 更完整的重载实现如果你启用了需要对齐分配的容器例如eastl::vector的某些场景同时提供对齐版本会更稳妥void* __cdecl operator new[](size_t size, const char* name, int flags, unsigned debugFlags, const char* file, int line) { (void)name; (void)flags; (void)debugFlags; (void)file; (void)line; return new uint8_t[size]; } void* __cdecl operator new[](size_t size, size_t alignment, size_t alignmentOffset, const char* name, int flags, unsigned debugFlags, const char* file, int line) { (void)name; (void)flags; (void)debugFlags; (void)file; (void)line; (void)alignmentOffset; #if defined(_MSC_VER) return _aligned_malloc(size, alignment); #else return aligned_alloc(alignment, size); #endif }4.4 什么时候可以跳过以下几种情况下默认分配器的这段代码会整体被替换你可以不提供上述重载定义了EASTL_USER_DEFINED_ALLOCATOR此时 source/allocator_eastl.cpp 中默认分配器实现gDefaultAllocator、GetDefaultAllocator/SetDefaultAllocator以及 allocator.h 里的 placement new 调用块均被跳过由你自备一套分配器实现。以 DLL 方式构建/使用 EASTLEASTL_DLL为 1通常由 EABase 的EA_DLL传导而来见 include/EASTL/internal/config.hallocator.h 不再声明这些重载allocate()内部改为走 CRTnew char[...]并自行做对齐包装见 include/EASTL/allocator.h。为所有容器显式传入自定义分配器且该分配器不依赖默认实现。对于大多数“静态链接 EASTL”的游戏与工具工程官方文档的示例——一个转发到全局new[]的重载——就是正确的起点。五、常见问题与检查清单把以上内容汇总成一份自查清单接入出错时可逐项核对检查项说明头文件路径include/是否已加入 include 路径CMake 方式下由target_include_directories(EASTL PUBLIC include)自动携带依赖库EABase 等 EA 配套库的头文件是否可达开源快照下 CMake 方式由 FetchContent 自动处理库链接是否正确链接EASTL.lib且 Debug/Release 配置与库的编译配置一一对应operator new[]是否提供了带调试参数的两种重载非 DLL、非自定义分配器时必需语言标准目标工程是否满足 C14 及以上仓库要求cxx_std_14natvis可选是否加载了 doc/EASTL.natvis以启用 VS 调试可视化编译宏一致性与 EASTL 一同构建时注意_CHAR16T、EASTL_OPENSOURCE1等宏参考 CMakeLists.txt官方测试工程 test/CMakeLists.txt 也可以作为“最小可编译工程”的活样板它把source/*.cpp全部编入测试目标、复用scripts/CMake/CommonCppFlags.cmake统一编译选项并定义了EASTL_OPENSOURCE1等与顶层一致的关键宏——照抄这套配置骨架即可在自己的工程里复现官方测试所依赖的编译环境。六、延伸阅读官方集成文档原文doc/CMake/EASTL_Project_Integration.md顶层 CMake 构建入口CMakeLists.txt默认分配器与operator new[]声明include/EASTL/allocator.h分配器全局开关与调试级别include/EASTL/internal/config.h默认分配器实现source/allocator_eastl.cppVS 调试可视化文件doc/EASTL.natvis项目总览与包管理器说明README.md赞分享开发工具【免费下载链接】EASTLEASTL stands for Electronic Arts Standard Template Library. It is an extensive and robust implementation that has an emphasis on high performance.项目地址https://gitcode.com/gh_mirrors/ea/EASTL点击查看免费下载相关推荐将 ncnn 集成到自有项目CMake 与手工链接全指南将 ncnn 集成到自有项目CMake 与手工链接全指南 本指南以 use ncnn with own project.md https://link.git人工智能深度学习推理引擎本地部署EASTL 开源项目教程EASTL 开源项目教程 1. 项目的目录结构及介绍 EASTLElectronic Arts Standard Template Library是一个由E开发工具EASTL 开源项目教程EASTL 开源项目教程 项目介绍 EASTLElectronic Arts Standard Template Library是电子艺界Electron开发工具上一篇5分钟掌握M3U8下载器免费视频下载终极指南下一篇5个痛点场景Snap Hutao如何用开源工具箱解决原神玩家的真实问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表