QNX独特的工程目录结构
目录结构实例
以Ubuntu系统下,创建arm架构的demo工程为例。
目录结构说明
- config 用于存放配置文件
- lib 目录用于编译动态库和静态库
- src 目录用于编译可执行文件
- test 目录用于编译测试程序
以上目录名称均可以自定义,没有特殊规定。
工程目录的创建
手动创建各级目录及文件
可以通过mkdir和touch等命令创建所需要的工程目录和文件。
自动创建各级目录
使用 addvariant 命令可以自动创建出各级目录及所需的编译配置文件。
addvariant是一个shell脚本,它为源代码树创建一个目录结构,并确保这个结构的每一层都包含make实用程序所使用的必要文件。
addvariant 详细使用方法可以参考Qnx官方提供的 用户手册
参数 i 用来指定工程目录的层级,可以使用 addvariant -i OS/CPU/VARIANT xxx xxx xxx
指定工程目录的层级。
LIST=OS (if three levels are specified)
LIST=CPU (if two levels are specified)
LIST=VARIANT (if one level is specified)
以Demo工程为例,Demo工程最深目录为三级:
cd ./Demo
addvariant -i OS src aarch64 o-le
Creating /home/build/workspace/qnx/Demo/src directory...
Creating /home/build/workspace/qnx/Demo/src/aarch64 directory...
Creating /home/build/workspace/qnx/Demo/src/aarch64/o-le directory...
生成结果如下:
Makefile 与 Makefile.dnm
Makefile 文件可以使用 addvariant 命令自动生成,也可以修改文件,指定编译逻辑。
自动生成内容如下:
# Demo/Makefile
LIST=OS
ifndef QRECURSE
QRECURSE=recurse.mk
ifdef QCONFIG
QRDIR=$(dir $(QCONFIG))
endif
endif
include $(QRDIR)$(QRECURSE)# Demo/src/Makefile
LIST=CPU
ifndef QRECURSE
QRECURSE=recurse.mk
ifdef QCONFIG
QRDIR=$(dir $(QCONFIG))
endif
endif
include $(QRDIR)$(QRECURSE)# Demo/src/aarch64/Makefile
LIST=VARIANT
ifndef QRECURSE
QRECURSE=recurse.mk
ifdef QCONFIG
QRDIR=$(dir $(QCONFIG))
endif
endif
include $(QRDIR)$(QRECURSE)# Demo/src/aarch64/o-le/Makefile
include ../../../common.mk
Makefile.dnm 文件比较特殊,该文件的作用为标记当前文件夹不参与递归编译,dnm:do not make。
当在Dome文件夹下执行make命令时,会Makefile 中指定的层级自动遍历当前路径下的文件夹,递归编译。当遇到Makefile.dnm文件时,自动跳过当前文件夹。
[build@Ubuntu_16.04] Demo$ make
make -j 16 -Cconfig -fMakefile
make[1]: Entering directory '/home/build/workspace/Demo/config'
make[1]: Nothing to be done for 'clean'.
make[1]: Leaving directory '/home/build/workspace/Demo/config'
make -j 16 -Csrc -fMakefile
make[1]: Entering directory '/home/build/workspace/Demo/src'
make -j 16 -Caarch64 -fMakefile
make[2]: Entering directory '/home/build/workspace/Demo/src'
make[2]: warning: -jN forced in submake: disabling jobserver mode.
make -j 16 -Co-le -fMakefile
make[3]: Entering directory '/home/build/workspace/Demo/src/aarch64'
make[3]: warning: -jN forced in submake: disabling jobserver mode.
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/qcc -Vgcc_ntoaarch64 -c -O2 -Wc,-Wall -DBUILDENV_qss -g -Os -Wall -march=armv8-a -mcpu=cortex-a57 -mtune=cortex-a57 -fstack-protector-strong -D__FILENAME__="\"demo.cpp\"" -D_FORTIFY_SOURCE=2 -ftrapv -D DIAG_BIGSUR -Wno-sequence-point -Wno-extra -Werror -I. -L/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/lib -L/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/usr/lib -Wl,--rpath-link,. -Wl,--rpath-link,install/armle-v7/lib -Wl,--rpath-link,/home/build/workspace/qnx/install/aarch64le/lib -Wl,--rpath-link,/home/build/workspace/qnx/install/aarch64le/usr/lib -Wl,--rpath-link,/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/lib -Wl,--rpath-link,/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/usr/lib -lslog2 -ljson -EL
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/usemsg -s __USAGENTO -s __USAGE -iVERSION -iTAGID -iDESCRIPTION -f diagnosis.pinfo /home/build/workspace/Demo/src/aarch64/o-le/diagnosis
make[3]: Leaving directory '/home/build/workspace/Demo/src/aarch64/o-le'
make[2]: Leaving directory '/home/build/workspace/Demo/src/aarch64'
make[1]: Leaving directory '/home/build/workspace/Demo/src'
make -j 16 -Ctest -fMakefile
make[1]: Entering directory '/home/build/workspace/Demo/test'
make -j 16 -Caarch64 -fMakefile
make[2]: Entering directory '/home/build/workspace/Demo/test'
make[2]: warning: -jN forced in submake: disabling jobserver mode.
make -j 16 -Co-le -fMakefile
make[3]: Entering directory '/home/build/workspace/Demo/test/aarch64'
make[3]: warning: -jN forced in submake: disabling jobserver mode.
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/qcc -Vgcc_ntoaarch64 -c -O2 -Wc,-Wall -DBUILDENV_qss -g -Os -Wall -march=armv8-a -mcpu=cortex-a57 -mtune=cortex-a57 -fstack-protector-strong -D__FILENAME__="\"demo_test.c\"" -D_FORTIFY_SOURCE=2 -ftrapv -Wno-sequence-point -Wno-extra -Werror -I. -I/home/build/workspace/Demo/test/aarch64/o-le -I/home/build/workspace/Demo/test/aarch64 -I/home/build/workspace/Demo/test -I/home/build/workspace/Demo/test/test -I/home/build/workspace/qnx/sdk/qnx700/target/qnx7/usr/include -EL -DVARIANT_le -DBUILDENV_qss /home/build/workspace/Demo/test/demo_test.c
/bin/rm -f /home/build/workspace/Demo/test/aarch64/o-le/diagnosis_test
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/qcc -Vgcc_ntoaarch64 -Wl,--no-keep-memory -Map,/home/build/workspace/Demo/test/aarch64/o-le/diagnosis_test.map -o /home/build/workspace/Demo/test/aarch64/o-le/ demo_test.o -L. -L/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/lib -L/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/usr/lib -Wl,--rpath-link,. -Wl,--rpath-link,/home/build/workspace/qnx/install/aarch64le/vendor/common/lib -Wl,--rpath-link,/home/build/workspace/qnx/install/aarch64le/lib -Wl,--rpath-link,/home/build/workspace/qnx/install/aarch64le/usr/lib -Wl,--rpath-link,/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/lib -Wl,--rpath-link,/home/build/workspace/qnx/sdk/qnx700/target/qnx7/aarch64le/usr/lib -ldemo_common -EL
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/usemsg -s __USAGENTO -s __USAGE -iVERSION -iTAGID -iDESCRIPTION -f diagnosis_test.pinfo /home/build/workspace/Demo/test/aarch64/o-le/demo_test
make[3]: Leaving directory '/home/build/workspace/Demo/test/aarch64/o-le'
make[2]: Leaving directory '/home/build/workspace/Demo/test/aarch64'
make[1]: Leaving directory '/home/build/workspace/Demo/test'
从上编译日志中可以发现,编译时并没有进入到lib目录下编译。
那如何编译lib下的文件?
可以切换到lib目录下执行make,或者指定make 编译路径
[build@Ubuntu_16.04] Demo$ cd lib/
[build@Ubuntu_16.04] lib$ ls
Makefile Makefile.dnm aarch64 common.mk demo_common.c public
[build@Ubuntu_16.04] lib$ make hinstall
make -j 16 -Caarch64 -fMakefile hinstall
make[1]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make -j 16 -Cso-le -fMakefile hinstall
make[2]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make[2]: warning: -jN forced in submake: disabling jobserver mode.
make[2]: Leaving directory '/home/build/workspace/Demo/lib/aarch64/so-le'
make[1]: Leaving directory '/home/build/workspace/Demo/lib/aarch64'
[build@Ubuntu_16.04] lib$ make install
make -j 16 -Caarch64 -fMakefile install
make[1]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make -j 16 -Cso-le -fMakefile install
make[2]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make[2]: warning: -jN forced in submake: disabling jobserver mode.
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/qnx_cp -fpc libdemo_common.so /home/build/workspace/qnx/install/aarch64le/vendor/common/lib/libdemo_common.so
/home/build/workspace/qnx/sdk/qnx700/host/linux/x86_64/usr/bin/qnx_cp -fpc libdemo_commonS.a /home/build/workspace/qnx/install/aarch64le/vendor/common/lib/libdemo_commonS.a
make[2]: Leaving directory '/home/build/workspace/Demo/lib/aarch64/so-le'
make[1]: Leaving directory '/home/build/workspace//lib/aarch64'
.use 文件
给文件为qnx工程的说明文件,类似与和help文档,可以在目标设备上通过use 命令查看某可执行文件或者库的使用方法。
.use 文件中可以添加功能介绍、启动参数的含义以及使用方法示例:
# demo_test.use
%C Demo test examplesloc <addr>Base address for device registers.intr <intr>Signal <intr> for device interrupts.device <i2c_name>i2c physical device name. this option is ignored if type is none.Examples:demo_test loc 0x100000 intr gic:10
目标设备中使用use命令查看demo说明:
# use demo_test
Demo test examplesloc <addr>Base address for device registers.intr <intr>Signal <intr> for device interrupts.device <i2c_name>i2c physical device name. this option is ignored if type is none.Examples:demo_test loc 0x100000 intr gic:10
#
common.mk中使用 USEFILE 宏指定use文件
#===== USEFILE - the file containing the usage message for the application.
USEFILE=$(PROJECT_ROOT)/demo.use
如果工程中没有.use文件,应该将 USEFILE 赋值为空,不能删除,否则会编译报错。
#===== USEFILE - the file containing the usage message for the application.
USEFILE=
public 文件夹
public文件夹中可以存放系统公用的头文件,在编译前,先使用 make hinstall 命令将public目录下的头文件拷贝至系统公共头文件下。
[build@Ubuntu_16.04] workspace$ find . -name demo_common.h
./Demo/lib/public/demo_common.h
[build@Ubuntu_16.04] workspace$ cd ./Demo/lib
[build@Ubuntu_16.04] lib$ ls ./public
demo_common.h
[build@Ubuntu_16.04] lib$ make hinstall
make -j 16 -Caarch64 -fMakefile hinstall
make[1]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make -j 16 -Cso-le -fMakefile hinstall
make[2]: Entering directory '/home/build/workspace/Demo/lib/aarch64'
make[2]: warning: -jN forced in submake: disabling jobserver mode.
make[2]: Leaving directory '/home/build/workspace/Demo/lib/aarch64/so-le'
make[1]: Leaving directory '/home/build/workspace/Demo/lib/aarch64'
[build@Ubuntu_16.04] lib$ ls
Makefile Makefile.dnm aarch64 common.mk demo_common.c public
[build@Ubuntu_16.04] lib$ cd ../../
[build@Ubuntu_16.04] workspace$ find . -name demo_common.h
./Demo/lib/public/demo_common.h
./qnx/install/usr/include/demo_common.h
[build@Ubuntu_16.04] workspace$
执行 make hinstall 后,新增 ./qnx/install/usr/include/demo_common.h 文件。
QNX独特的工程目录结构相关推荐
- 脚手架工程:工程目录结构
工程结构 整个前端工程的工程目录结构如下:
- Android发展 四大组件简介 SDK目录结构 工程目录结构
Andorid发行版本 Android 1.0(Astro"铁臂阿童木") 2008年9月23日,发布Android操作系统中的第一个正式版本:Android 1.0(Astro& ...
- 黑马旅游网编写练习(4)--优化工程目录结构
黑马旅游网编写练习(4)–优化工程目录结构 经过前面的三次练习,已经实现了用户的登录,账户激活,以及用户退出的相关功能:然而在实际项目过程中,这些当然只能算是基础功能:在此过程中,我们为每一个小功能都 ...
- 《学Unity的猫》——第五章:规范Unity的工程目录结构
文章目录 5.1 不要把玩具乱丢 5.2 Unity工程目录结构 5.3 Resources.Load实战测试 5.3.1 资源下载与导入 5.3.2 目录整理 5.3.3 代码动态加载资源 5.3. ...
- ros入门 工程目录结构、节点通信方式、基本操作命令
目录 ROS(Robot Operating System) ros的特点 ros的系统实现 ROS(Robot Operating System) ros的基本框架是斯坦福大学人工智能实验室在STA ...
- yocto 工程目录结构及大概含义
转载地址:https://www.cnblogs.com/AaronSeeWorld/p/13065793.html Yocto目录结构解析 ├── build │ ├── bitbake.loc ...
- android如何打开工程文件夹,Android工程目录结构介绍
当我们创建完Android工程如(HelloAndroid)后,展开"Package Explorer"窗口里的"HelloAndroid"项名称,可以看见如下 ...
- HarmonyOS Java工程目录结构
Java整体的工程目录 .gradle 是Gradle配置文件,由系统自动生成,一般情况下不需要进行修改 .idea 是系统加载一些配置文件以及缓存之类的文件,由系统自动生成,一般情况下不需要进行修改 ...
- 完整的项目工程目录结构
为什么80%的码农都做不了架构师?>>> 在项目开发过程中,如何有序的保存项目中的各类数据文件,建立一个分类清晰.方便管理的目录结构是非常重要的. 综合以前的项目和一些朋友的项 ...
最新文章
- 1分钟快速生成用于网页内容提取的xslt
- 009_Get请求中文乱码
- pc工具不支持stb的加密方式_如何选择加密狗?九大标准
- springboot启动过程_spring5/springboot2源码学习 -- spring boot 应用的启动过程
- “我,程序员,33岁,距离退休,只剩2年了!”
- 2.12linux csf 防火墙 防止少量的ddos cc攻击
- python数据分析框架
- 动态表单 mysql_动态表单实现思路
- Halcon实现Otsu最大类间方差法
- http 502错误怎么解决?
- InputStreamReader乱码
- android原生TTS+语音引擎 实现纯离线 免费的中英TTS
- Excel/Word 插入图表 InvokeMember设置图表类型
- zabbix与nagios对比
- 怎么把计算机里的文件放到桌面上,ipad怎么把文件放到桌面
- 单目标跟踪SiamMask:特定目标车辆追踪 part2
- 阿里巴巴鸿蒙系统,都说鸿蒙系统要比阿里YunOS更容易成功,到底容易在哪些方面?...
- JDK源码中,都有哪些NB的设计模式?
- 四川省通江中学2021年高考成绩查询,「通江中学」2021年年通江中学升学率高不高?...
- 谷歌浏览器内核Cef js代码整理(一)
热门文章
- Filecoin官方:8.12矿工线上会议记录 | 中链云
- 表格的列标题具有排序功能可便于读者查阅
- Google Bigtable (中文版)
- postgres9.5.7 wal日志归档和任意时间点恢复数据
- docker 安装 rabbitmq详细与遇到错误解决
- 基于PreSCAN Matlab/Simulink的智能驾驶联合仿真【详细图文】
- 爱看广场舞的老爷爷的笔记 --shell命令
- 白话完全解析动态规划原理及相关问题(二)
- 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
- 如何在项目管理中定义可交付成果?