os_rendering_unittest.cc(793): error C2220: 警告被视为错误 - 没有生成“object”文件(转)

原标题:Windows编译构建CEF发行版

下载

在 CEF 发行版网站(Chromium Embedded Framework (CEF) Automated Builds)下载对应的 Standard Distribution 版本,本文以 CEF 75.1.14(cef_binary_75.1.8+g84fed5d+chromium-75.0.3770.100_windows32.tar.bz2)为例

使用 CMake 构建

打开 cmake-gui,设置源码和生成路径:

  • Where is the source code: D:/code/git/cef-builds/cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32
  • Where to build the binaries: D:/code/git/cef-builds/cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32/build

点击 Configure 生成配置,修改:

  • 生成动态库(个人偏好):CEF_RUNTIME_LIBRARY_FLAG 从 /MT 改为 /MD
  • 不用沙盒(原因见 这里):不勾选 USE_SANDBOX

点击 Configure、Generate 生成 VS 工程

使用 VS 编译

ceftests 项目会有文件格式错误

1>------ 已启动生成: 项目: ceftests, 配置: Debug Win32 ------
1>os_rendering_unittest.cc
1>D:\code\git\cef-builds\cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32\tests\ceftests\os_rendering_unittest.cc(794): error C2220: 警告被视为错误 - 没有生成“object”文件
1>D:\code\git\cef-builds\cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32\tests\ceftests\os_rendering_unittest.cc(794): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>D:\code\git\cef-builds\cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32\tests\ceftests\os_rendering_unittest.cc(955): error C2001: 常量中有换行符
1>D:\code\git\cef-builds\CEF 79.1.38\cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32\tests\ceftests\os_rendering_unittest.cc(998): error C2001: 常量中有换行符
1>D:\code\git\cef-builds\cef_binary_75.1.14+gc81164e+chromium-75.0.3770.100_windows32\tests\ceftests\os_rendering_unittest.cc(998): fatal error C1075: “{”: 未找到匹配令牌
1>已完成生成项目“ceftests.vcxproj”的操作 - 失败。

用记事本打开 os_rendering_unittest.cc 文件,另存为 带有 BOM 的 UTF-8 编码,覆盖原文件。

重新编译则会编译通过。

然后设置 cefclient 为启动项目,F5,则可看到 Google 为主页的一个浏览器 Demo

<think> 首先,用户的问题是关于解决编译错误:"致命错误:drm/drm_gem_cma_helper.h:没有那个文件或目录"。这看起来是Linux内核开发中的一个问题。 用户提供了几个引用,这些引用是关于DRM(Direct Rendering Manager)和GEM(Graphics Execution Manager)的。让我快速回顾这些引用: - 引用[1]: 描述了drm_gem.c文件的作用,它是DRM框架的核心部分,处理GEM模块。 - 引用[2]: 提到drm_gem_cma_create()函数,用于分配和初始化GEM对象。 - 引用[3]: 讨论了使用GEM的驱动需要设置DRIVER_GEM位。 - 引用[4]: 展示了drm_gem_cma_create_with_handle()函数的代码片段,用于创建DMA缓冲区。 用户的问题是:"致命错误:drm/drm_gem_cma_helper.h:没有那个文件或目录"。这表示在编译代码时,编译器找不到drm_gem_cma_helper.h头文件。 现在,我需要基于这些引用和一般知识来提供解决方法。尽管引用不是直接解决这个错误,但它们提供了上下文。 可能的原因和解决方法: 1. **缺少内核头文件或开发包**:这个头文件是Linux内核DRM框架的一部分。如果用户没有安装正确的内核头文件或开发包,就会报这个错误- 解决方法:安装Linux内核头文件或特定于DRM的开发包。例如,在Ubuntu上,可以安装`linux-headers-$(uname -r)`或`libdrm-dev`包。 - 引用中没有直接提到这个,但这是一个常见问题。 2. **内核版本不兼容**:drm_gem_cma_helper.h可能只在较新的内核版本中可用。如果用户使用的是旧内核,这个文件可能不存在。 - 解决方法:更新内核到支持该文件的版本。 - 从引用[2]和[4]中,提到了drm_gem_cma_create()函数,这表明CMA(Contiguous Memory Allocator)是DRM的一部分,可能需要较新的内核。 3. **路径问题**:代码中可能包含了错误的路径。头文件应该位于标准位置,如`/usr/include/drm/`。 - 解决方法:检查头文件是否安装在系统中。使用命令`find /usr/include -name drm_gem_cma_helper.h`来搜索。 4. **驱动特定问题**:如果用户正在编译自定义驱动,可能没有正确设置环境。 - 解决方法:确保编译环境正确配置,包括内核源代码路径。 基于引用: - 引用[2]提到"drm_gem_cma_create()",这与头文件相关。 - 引用[4]展示了代码,使用drm_gem_cma_create(),这需要drm_gem_cma_helper.h。 所以,解决方法应该包括安装必要的包。 标准步骤: - 在基于Debian的系统(如Ubuntu)上,运行:`sudo apt install linux-headers-$(uname -r) libdrm-dev` - 在基于RPM的系统(如Fedora)上,运行:`sudo dnf install kernel-devel libdrm-devel` 用户可能没有指定发行版,所以给出通用建议。 确保回答结构清晰,使用中文,并添加相关问题。 最后,生成相关问题。 回答结构: 1. **解释错误原因**:简要说明为什么会出现这个错误。 2. **提供解决方法**:逐步给出解决方案。 3. **引用支持**:自然地添加引用标识。 4. **生成相关问题**:在结束时添加相关问题部分。 </think>### 解决“致命错误:drm/drm_gem_cma_helper.h:没有那个文件或目录”的方法 这个错误通常发生在 Linux 内核开发或编译 DRM(Direct Rendering Manager)相关代码时,表示编译器无法找到 `drm_gem_cma_helper.h` 头文件。该文件是 DRM 框架中 GEM(Graphics Execution Manager)模块的一部分,主要用于管理连续内存分配(CMA),在引用[2]中提到的 `drm_gem_cma_create()` 函数就依赖于这个头文件[^2]。错误可能由以下原因引起: - **缺少内核头文件或开发包**:系统未安装对应的 Linux 内核头文件或 DRM 开发库。 - **内核版本不兼容**:`drm_gem_cma_helper.h` 在较旧的内核版本中可能不存在或已被更名(例如,在 Linux 5.11+ 中,CMA 功能被整合到更通用的接口中)。 - **编译环境配置错误**:编译时未正确指定内核源代码路径。 - **代码依赖问题**:引用的代码基于特定内核版本,而您的环境不匹配。 以下是逐步解决方法,请根据您的 Linux 发行版和内核版本操作(以 root 或 sudo 权限执行): #### 步骤 1: 安装必要的内核头文件和开发包 确保系统安装了当前内核版本的头文件和 DRM 开发库。这将提供缺失的 `drm_gem_cma_helper.h` 文件- **Ubuntu/Debian 系统**: ```bash sudo apt update sudo apt install linux-headers-$(uname -r) libdrm-dev ``` - **Fedora/CentOS/RHEL 系统**: ```bash sudo dnf update sudo dnf install kernel-devel libdrm-devel ``` - **Arch Linux/Manjaro 系统**: ```bash sudo pacman -Syu sudo pacman -S linux-headers libdrm ``` 安装后,头文件通常位于 `/usr/include/drm/` 目录下。使用命令验证文件是否存在: ```bash find /usr/include -name drm_gem_cma_helper.h ``` #### 步骤 2: 检查内核版本兼容性 如果步骤 1 无法解决问题,您的内核版本可能过旧或过新: - **查看内核版本**: ```bash uname -r ``` - **如果内核版本 < 5.0**:`drm_gem_cma_helper.h` 在旧版本中可能不可用。建议升级内核: - Ubuntu/Debian: `sudo apt install --install-recommends linux-generic` - Fedora: `sudo dnf upgrade kernel` - **如果内核版本 ≥ 5.11**:CMA 功能已被重构。在较新内核中,应改用 `drm/drm_gem.h` 或驱动特定头文件。例如,引用[1]提到 GEM 模块已抽象化,驱动需通过 `drm_gem_object_funcs` 扩展[^1]。检查您的代码,替换 `drm_gem_cma_helper.h` 为: ```c #include <drm/drm_gem.h> #include <drm/drm_gem_cma.h> // 如果可用,否则使用通用接口 ``` #### 步骤 3: 配置编译环境 如果编译自定义内核模块(如 DRM 驱动),确保 Makefile 正确引用内核源代码路径: - 在 Makefile 中添加内核路径: ```makefile KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build ``` - 然后运行: ```bash make -C $(KERNEL_DIR) M=$(PWD) modules ``` 如果问题持续,导出内核头文件路径: ```bash export CPATH=/usr/include/drm:$CPATH ``` #### 步骤 4: 验证和测试 - 重新编译代码,观察错误是否解决。 - 如果仍报,检查代码是否依赖特定驱动实现。引用[4]显示,CMA 操作需要驱动支持(如 `drm_gem_cma_create`)[^4]。确保您的驱动在 `struct drm_driver` 中设置了 `DRIVER_GEM` 标志,如引用[3]所述[^3]。 ### 常见原因和预防 - **原因**:DRM GEM 模块在 Linux 内核中快速演进,头文件路径或名称可能随版本变化。 - **预防**:开发时使用与目标内核匹配的版本,并定期更新开发包。 如果以上步骤无效,请提供更多细节(如 Linux 发行版、内核版本和错误日志),以便进一步诊断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值