当前位置: 首页 > news >正文

兰州北山生态建设局网站网站建设+开源

兰州北山生态建设局网站,网站建设+开源,软文什么意思,阳江房产网58同城由于3#xff1a;Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano#xff08;ARM#xff09;_月上林梢的博客-CSDN博客 这一篇文章只用手动配置#xff0c;一直在点、点、点。比较 LOW#xff0c;现在在Ubuntu上使用Cmake实现交叉编译QT程序到Jetson Orin Nano…由于3Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin NanoARM_月上林梢的博客-CSDN博客 这一篇文章只用手动配置一直在点、点、点。比较 LOW现在在Ubuntu上使用Cmake实现交叉编译QT程序到Jetson Orin Nano上。 提醒 我的工作环境是Visual StudioQTarm由于Ubuntu下没有Visual studio 只能在Ubuntu上创建对应的文件通过CMake的方式对VSQT项目进行交叉编译然后在ARM(Jetson Orin Nano)上进行程序具体过程如下 注 在此文中 UbuntuJetson Orin Nano 上的QT环境不再赘述请看以往文章进行配置相关的编译环境。 1.创建文件 需要创建的文件有 arm_linux_setup.cmake用于存放arm交叉编译工具位置具体内容如下 cmake_minimum_required(VERSION 3.15)#用于设定需要的最低版本的CMake ## include_guard([DIRECTORY|GLOBAL]) #为CMake当前正在处理的文件提供包含保护可选参数指定保护的范围 #DIRECTORYinclude guard适用于当前目录及以下子目录。该文件只会在该目录范围内包含一次但可能会被该目录以外的其他文件再次包含即父目录或其他目录而不是由当前文件或其子目录中的add_subdirectory或include拉入。 #GLOBALinclude guard适用于整个构建。无论范围如何当前文件只包含一次。 include_guard(GLOBAL) ## CMAKE_SYSTEM_NAME 交叉编译的必设参数只有当CMAKE_SYSTEM_NAME这个变量被设置了CMake才认为此时正在交叉编译它会额外设置一个变量CMAKE_CROSSCOMPILING为true. set(CMAKE_SYSTEM_NAME Linux) #CMAKE_SYSTEM_PROCESSOR的可选值大多数情况下可以使用命令 uname -m 查看 set(CMAKE_SYSTEM_PROCESSOR arm) #设置 变量TARGET_SYSROOT为/opt/Qt5JetsonOrinNano/sysroot /opt/Qt5JetsonOrinNano/sysroot为 同步arm上的库文件 set(TARGET_SYSROOT /opt/Qt5JetsonOrinNano/sysroot) # CROSS_COMPILER 交叉编译工具的目录 set(CROSS_COMPILER /usr/bin) #CMAKE_SYSROOT 一般设置为工具链的sysroot目录CMAKE_STAGING_PREFIX可以设置为我们自定义的根文件系统目录里面已安装之前编译的一些库及头文件这样cmake可以从这两个目录中找到相关依赖。 set(CMAKE_SYSROOT ${TARGET_SYSROOT}) # c和C的交叉编译工具 set(CMAKE_C_COMPILER ${CROSS_COMPILER}/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER ${CROSS_COMPILER}/aarch64-linux-gnu-g) # 下面用不到 ## CMake变量CMAKE_FIND_ROOT_PATH指定了一个或者多个优先于其他搜索路径的搜索路径。该变量能够有效地重新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时该变量十分有用用该变量指向目标环境的根目录然后CMake将会在那里查找。默认情况下在CMAKE_FIND_ROOT_PATH中列出的路径会首先被搜索然后是“非根”路径。该默认规则可以通过设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY做出调整。在每次调用该命令之前都可以通过设置这个变量来手动覆盖默认行为。如果使用了NO_CMAKE_FIND_ROOT_PATH变量那么只有重定位的路径会被搜索。 ## set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) ## set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) ## set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ## set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) CMakeLists.txt 文件内容 # 标注最低版本 cmake_minimum_required(VERSION 3.15)# 设置项目名称 project(demo)# 设置C标准 C11 set(CMAKE_CXX_STANDARD 11)# 自动把ui转化为C代码 # uic qtcmake.ui ui_qtcmake.h set(CMAKE_AUTOUIC ON)# 自动生成元对象的C代码 set(CMAKE_AUTOMOC ON)# 自动生成资源文件 set(CMAKE_AUTORCC ON)# 在项目中加入需要编译的文件 add_executable(${PROJECT_NAME}main.cpp#res.qrc 资源文件 有的话加上没有则不用加mywidget.cpp mywidget.hmywidget.ui )# 根据自己电脑的环境写死的指定Qt5_DIR这个变量 # 目的是寻找 Qt5Config.cmake 这个文件 set(Qt5_DIR /opt/Qt5JetsonOrinNano/sysroot/usr/local/Qt5JetsonOrinNano/lib/cmake/Qt5/)# find_package 查找内部库 # 导入qt的库 # cmake通过qt5提供的查找方案去查找对应的库 # 这里以查找 Widgets库 为例 find_package(Qt5 COMPONENTS Widgets REQUIRED PATHS /opt/ NO_DEFAULT_PATH)# 指定qt依赖的动态库 # Qt5 自带连接头文件 target_link_libraries(${PROJECT_NAME}Qt5::Widgets )main.cpp文件 #include mywidget.h#include QApplicationint main(int argc, char *argv[]) {QApplication a(argc, argv);mywidget w;w.show();return a.exec(); } mywidget.cpp #include mywidget.h #include ui_mywidget.hmywidget::mywidget(QWidget *parent): QWidget(parent), ui(new Ui::mywidget) {ui-setupUi(this); }mywidget::~mywidget() {delete ui; }mywidget.h #ifndef MYWIDGET_H #define MYWIDGET_H#include QWidgetQT_BEGIN_NAMESPACE namespace Ui { class mywidget; } QT_END_NAMESPACEclass mywidget : public QWidget {Q_OBJECTpublic:mywidget(QWidget *parent nullptr);~mywidget();private:Ui::mywidget *ui; }; #endif // MYWIDGET_H mywidget.ui ?xml version1.0 encodingUTF-8? ui version4.0classmywidget/classwidget classQWidget namemywidgetproperty namegeometryrectx0/xy0/ywidth800/widthheight600/height/rect/propertyproperty namewindowTitlestringmywidget/string/propertywidget classQPushButton namepushButtonproperty namegeometryrectx230/xy130/ywidth80/widthheight23/height/rect/propertyproperty nametextstringdemo/string/property/widget/widgetresources/connections/ /ui2. 编译 进入到build目录下进行编译 cd build # -DCMAKE_TOOLCHAIN_FILE指定工具链文件 sudo cmake -DCMAKE_TOOLCHAIN_FILE../arm_linux_setup.cmake .. # 输出的log如下 -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc -- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g -- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/tanglin/cmake/build ls #执行上面命令之后会产生下面4个文件 CMakeCache.txt CMakeFiles cmake_install.cmake Makefile #执行sudo make 命令 sudo make ## 输出的log 如下 Scanning dependencies of target demo_autogen [ 20%] Automatic MOC and UIC for target demo [ 20%] Built target demo_autogen Scanning dependencies of target demo [ 40%] Building CXX object CMakeFiles/demo.dir/demo_autogen/mocs_compilation.cpp.o [ 60%] Building CXX object CMakeFiles/demo.dir/main.cpp.o [ 80%] Building CXX object CMakeFiles/demo.dir/mywidget.cpp.o [100%] Linking CXX executable demo [100%] Built target demo #查看输出 ls CMakeCache.txt CMakeFiles cmake_install.cmake demo demo_autogen Makefile #demo 就是上面CMakeLists.txt中设置的项目名称查看demo的文件类型 file demo ##输出内容如下ARM aarch64 就是我们需要的文件 demo: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]a5d0d1dd4e080e68a28392423e1ce419cee55042, for GNU/Linux 3.7.0, not stripped #把内容拷贝到arm机器上并运行 scp ./demo nvidiaarmIP:/tmp 3. 效果 在arm机器上打开刚才生成的文件 ./demo 4.时钟例子 按照上面方法完成一个时钟demo具体代码如下(这个demo没有UI文件) main.cpp #include widget.h #include QApplicationint main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }widget.cpp #include widget.h #includeQPainter #includeQTimer #includeQTime #includeQString #includeQVector #includeQMap#define CLOCK_RADIUS (80) //时钟的半径 #define PANEL_RADIUS_NUM (3) //表盘的3个圆 #define PANEL_RADIUS1 CLOCK_RADIUS //圆1的半径 #define PANEL_RADIUS2 (CLOCK_RADIUS - 6) //圆2的半径 #define PANEL_RADIUS3 (CLOCK_RADIUS - 8) //圆3的半径 #define HOUR_NUM_SIZE (10) //小时数字的字体大小//3个表针的形状三角形 static QPoint hourHand[3] {QPoint(5, 3),QPoint(-5, 3),QPoint(0, -30) }; static QPoint minuteHand[3] {QPoint(4, 6),QPoint(-4, 6),QPoint(0, -45) }; static QPoint secondHand[3] {QPoint(2, 10),QPoint(-2, 10),QPoint(0, -60) };//表针与刻度颜色 static QColor hourColor(255, 0, 0); static QColor minuteColor(0, 0, 255); static QColor secondColor(0, 255, 0);//表盘参数 struct panelPara{int radius;QColor color; }; //圆的半径与对于的颜色 static panelPara stPanelParaArr[] {{PANEL_RADIUS1, QColor(255, 200, 100)},{PANEL_RADIUS2, QColor(164, 211, 238)},{PANEL_RADIUS3, QColor(255, 255, 255)}, };Widget::Widget(QWidget *parent): QWidget(parent) {QTimer *timer new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(update()));timer-start(1000);setWindowTitle(tr(Clock));setMinimumSize(200, 200); //设置最小尺寸 }Widget::~Widget() {}void Widget::paintEvent(QPaintEvent *event) {int side qMin(width(), height());QTime time QTime::currentTime();QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.translate(width()/2, height()/2); //画图的基准位置painter.scale(side/200.0, side/200.0); //随窗口尺寸自动缩放//表盘for (int i0; iPANEL_RADIUS_NUM; i){QBrush brush(stPanelParaArr[i].color);QPen pen(stPanelParaArr[i].color);painter.setBrush(brush);painter.setPen(pen);painter.drawEllipse(-stPanelParaArr[i].radius, -stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius, 2*stPanelParaArr[i].radius);}//小时的表针painter.setPen(Qt::NoPen);painter.setBrush(hourColor);painter.save();painter.rotate(30.0 * ((time.hour() time.minute() / 60.0)));painter.drawConvexPolygon(hourHand, 3);painter.restore();//小时的刻度painter.setPen(hourColor);for (int i 0; i 12; i){painter.rotate(30.0);painter.drawLine(PANEL_RADIUS3-6, 0, PANEL_RADIUS3, 0);QFont font(TimesNewRoman, HOUR_NUM_SIZE);painter.setFont(font);painter.drawText(-HOUR_NUM_SIZE, -(CLOCK_RADIUS-15), 2*HOUR_NUM_SIZE, 2*HOUR_NUM_SIZE, Qt::AlignHCenter, QString::number(i1));}//分钟的表针painter.setPen(Qt::NoPen);painter.setBrush(minuteColor);painter.save();painter.rotate(6.0 * (time.minute() time.second() / 60.0));painter.drawConvexPolygon(minuteHand, 3);painter.restore();painter.setPen(minuteColor);for (int j 0; j 60; j){if ((j % 5) ! 0){painter.drawLine(PANEL_RADIUS3-4, 0, PANEL_RADIUS3, 0);}painter.rotate(6.0);}//秒钟的表针painter.setPen(Qt::NoPen);painter.setBrush(secondColor);painter.save();painter.rotate(6.0 * time.second());painter.drawConvexPolygon(secondHand, 3);painter.restore();painter.end(); }widget.h #ifndef WIDGET_H #define WIDGET_H#include QWidgetclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(QPaintEvent *event); };#endif // WIDGET_HCMakeLists.txt # 标注最低版本 cmake_minimum_required(VERSION 3.15)# 设置项目名称 project(clock)# 设置C标准 C11 set(CMAKE_CXX_STANDARD 11)# 自动把ui转化为C代码 # uic qtcmake.ui ui_qtcmake.h set(CMAKE_AUTOUIC ON)# 自动生成元对象的C代码 set(CMAKE_AUTOMOC ON)# 自动生成资源文件 set(CMAKE_AUTORCC ON)# 在项目中加入需要编译的文件 add_executable(${PROJECT_NAME}main.cppwidget.cpp widget.h )# 根据自己电脑的环境写死的指定Qt5_DIR这个变量 # 目的是寻找 Qt5Config.cmake 这个文件 set(Qt5_DIR /opt/Qt5JetsonOrinNano/sysroot/usr/local/Qt5JetsonOrinNano/lib/cmake/Qt5/)# find_package 查找内部库 # 导入qt的库 # cmake通过qt5提供的查找方案去查找对应的库 # 这里以查找 Widgets库 为例 find_package(Qt5 COMPONENTS Widgets REQUIRED PATHS /opt/ NO_DEFAULT_PATH)# 指定qt依赖的动态库 # Qt5 自带连接头文件 target_link_libraries(${PROJECT_NAME}Qt5::Widgets )arm_linux_setup.cmake cmake_minimum_required(VERSION 3.15)#用于设定需要的最低版本的CMake ## include_guard([DIRECTORY|GLOBAL]) #为CMake当前正在处理的文件提供包含保护可选参数指定保护的范围 #DIRECTORYinclude guard适用于当前目录及以下子目录。该文件只会在该目录范围内包含一次但可能会被该目录以外的其他文件再次包含即父目录或其他目录而不是由当前文件或其子目录中的add_subdirectory或include拉入。 #GLOBALinclude guard适用于整个构建。无论范围如何当前文件只包含一次。 include_guard(GLOBAL) ## CMAKE_SYSTEM_NAME 交叉编译的必设参数只有当CMAKE_SYSTEM_NAME这个变量被设置了CMake才认为此时正在交叉编译它会额外设置一个变量CMAKE_CROSSCOMPILING为true. set(CMAKE_SYSTEM_NAME Linux) #CMAKE_SYSTEM_PROCESSOR的可选值大多数情况下可以使用命令 uname -m 查看 set(CMAKE_SYSTEM_PROCESSOR arm) #设置 变量TARGET_SYSROOT为/opt/Qt5JetsonOrinNano/sysroot /opt/Qt5JetsonOrinNano/sysroot为 同步arm上的库文件 set(TARGET_SYSROOT /opt/Qt5JetsonOrinNano/sysroot) # CROSS_COMPILER 交叉编译工具的目录 set(CROSS_COMPILER /usr/bin) #CMAKE_SYSROOT 一般设置为工具链的sysroot目录CMAKE_STAGING_PREFIX可以设置为我们自定义的根文件系统目录里面已安装之前编译的一些库及头文件这样cmake可以从这两个目录中找到相关依赖。 set(CMAKE_SYSROOT ${TARGET_SYSROOT}) # c和C的交叉编译工具 set(CMAKE_C_COMPILER ${CROSS_COMPILER}/aarch64-linux-gn 效果
http://www.zqtcl.cn/news/45072/

相关文章:

  • 网站 固定ip奢侈品网站 方案
  • 武威网站seo广州哪家做网站还可以
  • 网站域名的选择方法wordpress鼠标轨迹
  • 建国内外网站有什么区别电子商务网站建设设计题
  • 西安做百度网站的邯郸哪有做网站的公司
  • 网页设计公司业绩介绍衡水seo
  • html5视频网站模板wordpress企业模板购买
  • 微信公众平台是什么西安百度网站快速优化
  • 网站建设4435现在个人网站怎么备案
  • 推广网站2024网络营销的特点有哪些?
  • 怎么查那些人输入做网站用php做网站视频
  • 一个网站需要几个人做wordpress文章存档插件
  • 黑河北京网站建设广州市企业网站建设企业
  • 长沙网站建设公司招聘it外包考核
  • 普通网站服务器wordpress阅读更多标签
  • 专业的外贸行业网站开发房地产最新消息利好
  • 做网站先用dw还是asp具体阐述对网站如何加强建设
  • 教学资源库网站建设立项申报书营销方案策划
  • 网站后台视频教程凡科建站登录入口
  • 专门做朋友圈小视频的网站制作商务网站信息标题应
  • 太仓有没有做网站建设的新人做直播哪个网站好
  • 深圳求做网站服装设计专业比较好的学校
  • 随州网站建设推荐局域网里做网站
  • 传奇手游开服表网站旅游网站建设导航栏
  • 零下一度网站建设app开发平台有哪些
  • 网站规划与建设参考文献延安网站建设推广
  • 泰安网站建设制作服务商城网站设计注意什么
  • 免费的企业网站源码帮人做推广的网站
  • 网站 空间 下载名字logo在线设计生成器
  • 市场上网站开发价格文化传播公司做网站宣传好吗