Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用CEF(五)— 在QT中集成CEF(2)基于CLion与CMake搭建环境

使用CEF(五)— 在QT中集成CEF(2)基于CLion与CMake搭建环境

作者头像
w4ngzhen
发布于 2023-10-17 02:14:18
发布于 2023-10-17 02:14:18
1.5K00
代码可运行
举报
文章被收录于专栏:编译思想编译思想
运行总次数:0
代码可运行

在前文《使用CEF(四)— 在QT中集成CEF(1):基本集成》中,我们使用VS+QT的插件搭建了一个基于QT+CEF的项目。时过境迁,笔者目前用的最多的就是CLion+CMake搭建C/C项目,并且CLion提供了对C/C强大的开发环境。此外,也想将CMake搭建QT项目作为一次实践,故由此文。

基础环境

  • QT 5.14.2
  • CEF 105.3.33以及对应版本wrapper(特别注意,wrapper以动态库(MD)版本进行编译。为了方便更多的开发者了解如何编译,我做了一个视频,视频是MT版本,请读者自行修改配置。)
  • CMake 3.24-rc5
  • VS2019

工程搭建

创建QtCefCMakeDemo文件夹,将基础环境提到的CEF的wrapper编译产物(libcef_dll_wrapper)+CEF相关库文件(libcef)、资源文件(*.pak)放置于QtCefCMakeDemo/CefFiles中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QtCefCMakeDemo
 └─ CefFiles
    ├─bin
    │  ├─Debug
    │  │  │  ...
    │  │  │  libcef.dll
    │  │  │  libcef.lib
    │  │  │  libcef_dll_wrapper.lib
    │  │  │  ...
    │  │  │
    │  │  └─swiftshader
    │  │          ...
    │  │
    │  └─Release
    │      │  ...
    │      │  libcef.dll
    │      │  libcef.lib
    │      │  libcef_dll_wrapper.lib
    │      │  ...
    │      │  
    │      └─swiftshader
    │              ...
    │
    ├─include
    │  各种.h头文件
    │  ...
    └─Resources
        │  cef.pak
        │  ..
        └─locales
                ...
                zh-CN.pak
                zh-TW.pak

并且在QtCefCMakeDemo目录下创建一个src目录,用以存放cpp代码。将咱们在《在QT中集成CEF(1)》中编写的相关代码存放于该目录下(QtCefDemo/QtCefDemo at main · w4ngzhen/QtCefDemo (github.com)):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QtCefCMakeDemo
 ├─ CefFiles
 └─ src
      app.manifest
      main.cpp
      qtcefwindow.cpp
      qtcefwindow.h
      qtcefwindow.qrc
      qtcefwindow.ui
      simple_app.cpp
      simple_app.h
      simple_handler.cpp
      simple_handler.h
      stdafx.cpp
      stdafx.h
  ... ...

请注意,这份代码已经已经有些许过时了,该份代码是基于cef_binary_87.1.13版本,而我们本文是基于cef_binary_105.3.33。所以使用新的cef、cef wrapper,但使用旧的应用层代码,势必会有问题。但是我们目前先不处理,后文会逐一列举并修改。

CMakeLists.txt

使用CMake来搭建QT+CEF项目,最核心的就是CMakeLists.txt文件内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)

PROJECT(QtCefCMakeDemo LANGUAGES CXX)
SET(CMAKE_BUILD_TYPE DEBUG)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

# 【QTCMAKE_PREFIX_PATH 实际值为本地安装的QT中的对应编译环境的目录
SET(CMAKE_PREFIX_PATH "D:\\Programs\\Qt\\Qt5.14.2\\5.14.2\\msvc2017_64")
# 配置了上述后,可以通过find_package来查找QT相关的cmake文件

# 【QTUICMOCRCC启用
# 引入的QT模块则会对.ui文件、.qtc文件以及QT中的元信息机制自动进行处理
SET(CMAKE_AUTOUIC ON)
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTORCC ON)

# 【QT】通过FIND_PACKAGE,CMake会查找QT相关模块cmake文件,
# 这些cmake文件自动处理了头文件的查找等,
# 不需要像配置CEF的头文件查找一样来配置QT的头文件引入
FIND_PACKAGE(Qt5 COMPONENTS Widgets REQUIRED)
# 【CEFCEF相关头文件的引入
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/CefFiles")
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/CefFiles/include")

# 添加项目所有的文件:
# 头文件、源文件、ui文件、qrc资源文件
# 特别的,在Windows下VS下,还需要manifest文件,并且该文件在cmake3.4以后就能够自动是被并被引入
ADD_EXECUTABLE(qt-cef
        WIN32
        src/qtcefwindow.h
        src/simple_app.h
        src/simple_handler.h
        src/main.cpp
        src/qtcefwindow.cpp
        src/simple_app.cpp
        src/simple_handler.cpp
        src/qtcefwindow.ui
        src/qtcefwindow.qrc
        src/app.manifest
        )

# QT库链接
TARGET_LINK_LIBRARIES(qt-cef
        PRIVATE
        # 【QTQT库链接
        Qt5::Widgets
        # 【CEF】cef相关库链接
        "${CMAKE_SOURCE_DIR}/CefFiles/bin/Debug/libcef.lib"
        "${CMAKE_SOURCE_DIR}/CefFiles/bin/Debug/libcef_dll_wrapper.lib"
        )

CMake的基础配置请各位读者自行了解。关于QT的配置,我都在CMakeLists.txt中以【QT】标识出;关于CEF的配置部分,我都在配置文件中以【CEF】标识出。

异常处理

此时,我们尝试编译整个项目的时候,会发现有一些编译/链接的错误,相关的错误大多数来源于CEF的头文件升级,接下来我将一一列举并处理。

error C3646: “OVERRIDE”: 未知重写说明符

出现点:simple_app.h、simple_handler.h

原因以及解决方案:实际上在87版本中这个OVERRIDE是一个宏,指代的就是关键字:override,不过在105版本中已经不存在了,所以手动修改为c++标准关键词即可。所以解决方案就是将所有出现OVERRIDE的地方改为关键词override

error C2039: “Bind”: 不是 “base” 的成员

出现点:simple_handler.cpp

原因以及解决方案:cef团队移除了该APIRemove deprecated base::Bind APIs (see issue #3140)),而是要求使用BindOnce,且该BindOnce所在定义的头文件由原来的#include "include/base/cef_bind.h"变为#include "include/base/cef_callback.h"。所以解决方案就是将头文件include/base/cef_bind.h改为引入include/base/cef_callback.h,且将base::Bind改为base::BindOnce。

warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

出现点:只要不是UTF-8 with BOM的文件,都可能出现这个警告

原因以及解决方案:CLion 默认使用 UTF-8 编码,MSVC 除非明确指定否则就使用 UTF-8 with BOM 或者当前代码页(详情可以参考这篇博文:解决 CLion + MSVC 下的字符编码问题)),所以在CMakeLists.txt中,在ADD_EXECUTABLE之前加上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 解决warning C4819
ADD_COMPILE_OPTIONS("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
ADD_COMPILE_OPTIONS("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

error C2664: “void CefWindowInfo::SetAsChild(HWND,const CefRect &)”: 无法将参数 2 从“RECT”转换为“const CefRect &”

出现点:qtcefwindow.cpp

原因以及解决方案:void CefWindowInfo::SetAsChild(HWND parent, const CefRect &windowBounds),第二个参数类型由原来的windef.h中定义的RECT结构体,调整为CefRect类,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-    RECT win_rect;
     QRect rect = this->geometry();
-    win_rect.left = rect.left();
-    win_rect.right = rect.right();
-    win_rect.top = rect.top();
-    win_rect.bottom = rect.bottom();
+// CEF引入CefRect,而不是windef.h中的RECT
+    CefRect win_rect(
+            rect.left(),
+            rect.top(),
+            rect.left() + rect.width() * devicePixelRatio(),
+            rect.top() + rect.height() * devicePixelRatio());

libcef_dll_wrapper.lib(libcef_dll_wrapper.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(mocs_compilation.cpp.obj 中)

出现点:链接阶段错误

原因以及解决方案:针对该问题,首先通过网上搜寻的博文了解到是:当前工程是Debug版本,而引用的库文件时Release版本。排查libcef_dll_wrapper.lib,确实使用的Debug版本。从报错了解到与mocs_compilation.cpp.obj_ITERATOR_DEBUG_LEVEL不一致。但是,这个mocs_compilation.cpp.obj是通过咱们项目生成的,是QT的MetaObject元对象机制下,MOC参与代码生成、编译输出的,其自动生成的代码在cmake-build-debug目录下的qt-cef_autogen中:

该cpp编译单元编译后的产物在项目根目录/cmake-build-debug/CMakeFiles/qt-cef.dir/qt-cef_autogen下:

使用VS的工具( 适用于开发人员的命令行 shell 和提示 - Visual Studio (Windows) | Microsoft Docs)中的dumpbin.exe工具(DUMPBIN 参考 | Microsoft Docs),可以查看库文件的_ITERATOR_DEBUG_LEVEL值。操作方式为:

  1. 找到VS开发者工具,方式有几种,主要有:1、从 Windows 菜单中启动;2、从文件菜单启动
  2. 启动后进入命令行,执行命令:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dumpbin /directives "库文件路径"

mocs_compilation.cpp.obj的_ITERATOR_DEBUG_LEVEL值

libcef_dll_wrapper.lib中一些obj的_ITERATOR_DEBUG_LEVEL值:

可以看出,两份库代码确实是不一样的。由于libcef_dll_wrapper.lib我们已经完成了编译,这里我们不考虑重新编译该lib库,而是通过配置CMake,让生成的mocs_compilation.cpp.obj等obj的_ITERATOR_DEBUG_LEVEL值为0,来匹配libcef_dll_wrapper.lib。所以,解决方案就是在CMakeLists.txt中,添加配置(c++ - How to add _ITERATOR_DEBUG_LEVEL to CMake? - Stack Overflow):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 解决warning C4819,需要在ADD_EXECUTABLE前加上
ADD_COMPILE_OPTIONS("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
ADD_COMPILE_OPTIONS("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
+# 控制项目所有编译单元_ITERATOR_DEBUG_LEVEL的值,
+# 这里设置为和libcef_dll_wrapper.lib中的obj一致。
+ADD_COMPILE_DEFINITIONS($<$<CONFIG:Debug>:_ITERATOR_DEBUG_LEVEL=0>)

# 【QTCMAKE_PREFIX_PATH 实际值为本地安装的QT中的对应编译环境的目录
SET(CMAKE_PREFIX_PATH "D:\\Programs\\Qt\\Qt5.14.2\\5.14.2\\msvc2017_64")

不出意外,此时我们已经处理了所有的编译和链接过程中的问题。控制台会显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
====================[ Build | qt-cef | Debug ]==================================
D:\Programs\ToolBoxApp\apps\CLion\ch-0\222.3739.54\bin\cmake\win\bin\cmake.exe --build D:\Projects\cpp-projects\qt-projects\qt-cef\QtCefCMakeDemo\cmake-build-debug --target qt-cef -j 12
[1/8] Automatic MOC and UIC for target qt-cef
[2/8] Building CXX object CMakeFiles\qt-cef.dir\qt-cef_autogen\UVLADIE3JM\qrc_qtcefwindow.cpp.obj
[3/8] Building CXX object CMakeFiles\qt-cef.dir\src\simple_app.cpp.obj
[4/8] Building CXX object CMakeFiles\qt-cef.dir\src\simple_handler.cpp.obj
[5/8] Building CXX object CMakeFiles\qt-cef.dir\qt-cef_autogen\mocs_compilation.cpp.obj
[6/8] Building CXX object CMakeFiles\qt-cef.dir\src\qtcefwindow.cpp.obj
[7/8] Building CXX object CMakeFiles\qt-cef.dir\src\main.cpp.obj
[8/8] Linking CXX executable qt-cef.exe

Build finished

但是在运行的过程中理论山还会出现两个问题:

Process finished with exit code -1073740791 (0xC0000409)

出现这个问题的时候,使用CLion的Debug模式进行,会看到错误调用栈:

经过问题排查,主要原因点:

在qtcefwindow构造函数中调用CefBrowserHost::CreateBrowserAPI,会传入初始要打开的页面地址,然而QString.toStdString得到string有问题(后续排查具体原因)。解决方案就是直接使用std::string变量即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     // 以下是将 SimpleHandler 与窗体进行关联的代码
     CefWindowInfo cef_wnd_info;
-    QString str_url = "https://www.cnblogs.com/w4ngzhen";
+    std::string str_url = "https://www.cnblogs.com/w4ngzhen";
     QRect rect = this->geometry();
     CefRect win_rect(
             rect.left(),
@@ -25,7 +25,7 @@ QtCefWindow::QtCefWindow(QWidget* parent)
     simple_handler_ = CefRefPtr<SimpleHandler>(new SimpleHandler());
     CefBrowserHost::CreateBrowser(cef_wnd_info,
         simple_handler_,
-        str_url.toStdString(),
+        str_url,
         cef_browser_settings,
         nullptr,

“Invalid COM thread model change” 或 运行后异常退出报错Exception 0x80000003 encountered at address 0x7ffbc43e9f3c

解决掉上述问题以后,笔者的环境下还会出现两种类似的问题:

  1. “Invalid COM thread model change”(实际上有些同学机器上,这个问题先于上面的字符串问题)
  2. 运行后异常退出报错Exception 0x80000003 encountered at address 0x7ffbc43e9f3c

这两种情况都是一个解决方案。问题点在于,QT的事件循环在多个进程(浏览器进程、渲染进程)均被初始化。实际上只需要在浏览器进程即可。解决方案就是将main.cpp中的init_for_cef提取到最前:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  // 解决高DPI下,界面比例问题
-    QApplication a(argc, argv);
+    // 将init_qt_cef提取到QApplication初始化之前
+    // 对于CEF多进程架构模型
+    // 因为【渲染进程】启动后,init_qt_cef中执行的CefExecuteProcess会阻塞住,
+    // 如果在此之前启动了QT的事件循环,那么会导致QT出现异常
+    // 所以,我们将init_qt_cef提前到QApplication初始化之前,
+    // 保证无论是浏览器进程还是渲染进程启动,都会进入init_qt_cef,但渲染进程会在里面阻塞,
+    // 不会进入后续的QT应用初始化
     const int result = init_qt_cef(argc, argv);
     if (result >= 0)
     {
         return result;
     }

+    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  // 解决高DPI下,界面比例问题
+    QApplication a(argc, argv);
+
     QtCefWindow w;
     w.show();
     a.exec();

对于CEF多进程架构模型,因为渲染进程启动后,init_qt_cef中执行的CefExecuteProcess会阻塞住,如果在此之前启动了QT的事件循环,那么会导致QT出现异常。 所以,我们将init_qt_cef提前到QApplication初始化之前,保证无论是浏览器进程还是渲染进程启动后,都会进入init_qt_cef,但渲染进程会在里面阻塞,不会进入后续的QT应用初始化。

效果演示与代码库

与本文相关的代码已经提交至Github,且按照整个文章的编写流程进行提交:

w4ngzhen/QtCefCmakeDemo (github.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-122,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用CEF(四)— 在QT中集成CEF(1)基本集成
QT作为C++下著名的跨平台软件开发框架,实现了一套代码可以在所有的操作系统、平台和屏幕类型上部署。我们前几篇文章讲解了如何构建一款基于CEF的简单的样例,但这些样例的GUI都是使用的原生的或者是控件功能不强大的CEF视图框架。本文将会重新开始,使用VS2019编写一款基于QT的并嵌入原生窗体的文章。
w4ngzhen
2023/10/17
2.7K0
使用CEF(四)— 在QT中集成CEF(1)基本集成
使用CEF(二)— 基于VS2019编写一个简单CEF样例
在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进行修改配置和代码编写,并在这个过程中介绍vs使用过程中和C++项目的结合。源码见文章末尾Github链接。
w4ngzhen
2023/10/18
1.8K0
使用CEF(二)— 基于VS2019编写一个简单CEF样例
使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
由于macOS下的应用程序结构导致了CEF这样的多进程架构程序在项目结构、运行架构上有很多细节需要关注,这一块的内容比起Windows要复杂的多,所以本文将会聚焦macOS下基于CEF的多进程应用架构的环境配置,并逐一说明了CMake的相关用法和CEF应用配置细节。
w4ngzhen
2023/12/14
1.2K4
使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建
披着CLion的外衣实则在讲CMake
至于 CLion 安装和基础设置,网上教程一大把,而且不是学习重点,根据自己需求配置即可。
字节星球Henry
2023/03/23
5.9K0
披着CLion的外衣实则在讲CMake
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
3.3K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMAKE入门实战
最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧,原作者github地址:https://github.com/wzpan/cmake-demo。
公众号guangcity
2019/09/20
1.6K0
CMAKE入门实战
c++版本cef详细使用
cef模块下载,内含有libcef的二次封装lib_cef_warper https://cef-builds.spotifycdn.com/index.html
sofu456
2023/02/02
1.7K0
使用CEF(六)— 解读CEF的cmake工程配置
距离笔者的《使用CEF》系列的第一篇文章居然已经过去两年了,在这么长一段时间里,笔者也写了很多其它的文章,再回看《使用CEF(一)— 起步》编写的内容,文笔稚嫩,内容单薄是显而易见的(主要是教大家按部就班的编译libcef_dll_wrapper库文件)。笔者一直以来的个性就是希望自己学习到的知识,研究出的内容,踩过的坑能够及时的写出来,介绍给更多的小伙伴。
w4ngzhen
2023/10/18
1.2K0
使用CEF(六)— 解读CEF的cmake工程配置
QT的cmake项目工程配置
QT的项目工程默认使用的是qmake,这本来也没什么问题。但是由于要用到vcpkg这个工具来管理第三方库,好像这个 vcpkg工具只能在cmake的项目中才能使用。
杨永贞
2022/04/13
3.8K0
把cef3集成到MFC中的一些坑
cef3变化太大了。要注意版本。笔者所用版本为:cef_binary_3.3626.1895.g7001d56_windows32 版本。在将cef3集成到MFC时,遇到了一些问题。google了很多文档,都是针对几个月之前的版本,由于api变化太多,某些坑不能解决。现在做一下记录,防止下次再掉坑里。
xiny120
2019/06/11
7K0
把cef3集成到MFC中的一些坑
FLTK基于cmake编译以及使用(Windows、macOS以及Linux)
最近因为一些学习的原因,需要使用一款跨平台的轻量级的GUI+图像绘制 C/C++库。经过一番调研以后,最终从GTK+、FLTK中选出了FLTK,跨平台、够轻量。本文将在Windows、macOS以及Linux Debian三套操作系统环境,对FLTK进行编译,并搭建简单Demo。这其中也有少许的坑,也在此文进行记录。
w4ngzhen
2023/10/17
1.2K0
FLTK基于cmake编译以及使用(Windows、macOS以及Linux)
深入浅出CMake(一):基础篇
CMake 是一个跨平台的编译构建工具,用来自动化生成 Makefile 之类的构建文件的。
Frank909
2019/03/15
1.4K0
Qt | CMake(Qt5 VS Qt6)
【2】将CMake缓存中的Qt5_DIR设置为Qt5Config.cmake文件的位置。
Qt历险记
2024/10/16
6830
Qt | CMake(Qt5 VS Qt6)
学习了C/C++,居然不了解Cmake这一利器
CMake 是一个跨平台的自动化建构系统,可以用简单的命令来控制软件编译过程。下面是一个关于如何使用 CMake 进行项目配置和编译的教程。
鳄鱼儿
2024/05/29
3930
学习了C/C++,居然不了解Cmake这一利器
cmake:设置编译选项的讲究(add_compile_options和CMAKE_CXX_FLAGS的区别)
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51731959
10km
2019/05/25
9K0
cmake快速入门「建议收藏」
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。
全栈程序员站长
2022/09/13
1.3K0
cmake快速入门「建议收藏」
CMake学习笔记
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!
CtrlX
2023/02/06
2.2K0
CMake常用命令的一些整理
CMake 是什么我就不用再多说什么了,相信大家都有接触才会看一篇文章。对于不太熟悉的开发人员可以把这篇文章当个查找手册。
混说Linux
2022/11/18
1.8K0
Android NDK 开发 | CMake 使用手册 - 初见篇
之前写过一篇 《[-NDK 导引篇 -] 在NDK开发之前你应知道的东西》 介绍了在进入 NDK 学习之前,如何摆正自己的角色。时隔两年,NDK 系列文章开始填坑,在上一篇 《 NDK 是什么 | FFmpeg 5.0 编译 so 库》 中,介绍了 NDK 的概念,以及其作用。
张风捷特烈
2022/09/20
1.5K0
Android NDK 开发 | CMake 使用手册 - 初见篇
CMake搭建编译环境总结
  交叉编译算是每个嵌入式开发者都会经历的一道坎吧,通俗的描述就是搭建Arm板代码编译环境,让代码能够在Arm板子上跑起来。常用到的编译工具为Makefile和CMake,本篇记录下CMake的常用技巧。
开源519
2022/12/01
2.7K0
相关推荐
使用CEF(四)— 在QT中集成CEF(1)基本集成
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验