目录结构实例

以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独特的工程目录结构相关推荐

  1. 脚手架工程:工程目录结构

    工程结构 整个前端工程的工程目录结构如下:

  2. Android发展 四大组件简介 SDK目录结构 工程目录结构

    Andorid发行版本 Android 1.0(Astro"铁臂阿童木") 2008年9月23日,发布Android操作系统中的第一个正式版本:Android 1.0(Astro& ...

  3. 黑马旅游网编写练习(4)--优化工程目录结构

    黑马旅游网编写练习(4)–优化工程目录结构 经过前面的三次练习,已经实现了用户的登录,账户激活,以及用户退出的相关功能:然而在实际项目过程中,这些当然只能算是基础功能:在此过程中,我们为每一个小功能都 ...

  4. 《学Unity的猫》——第五章:规范Unity的工程目录结构

    文章目录 5.1 不要把玩具乱丢 5.2 Unity工程目录结构 5.3 Resources.Load实战测试 5.3.1 资源下载与导入 5.3.2 目录整理 5.3.3 代码动态加载资源 5.3. ...

  5. ros入门 工程目录结构、节点通信方式、基本操作命令

    目录 ROS(Robot Operating System) ros的特点 ros的系统实现 ROS(Robot Operating System) ros的基本框架是斯坦福大学人工智能实验室在STA ...

  6. yocto 工程目录结构及大概含义

    转载地址:https://www.cnblogs.com/AaronSeeWorld/p/13065793.html Yocto目录结构解析 ├── build │   ├── bitbake.loc ...

  7. android如何打开工程文件夹,Android工程目录结构介绍

    当我们创建完Android工程如(HelloAndroid)后,展开"Package Explorer"窗口里的"HelloAndroid"项名称,可以看见如下 ...

  8. HarmonyOS Java工程目录结构

    Java整体的工程目录 .gradle 是Gradle配置文件,由系统自动生成,一般情况下不需要进行修改 .idea 是系统加载一些配置文件以及缓存之类的文件,由系统自动生成,一般情况下不需要进行修改 ...

  9. 完整的项目工程目录结构

    为什么80%的码农都做不了架构师?>>>    在项目开发过程中,如何有序的保存项目中的各类数据文件,建立一个分类清晰.方便管理的目录结构是非常重要的. 综合以前的项目和一些朋友的项 ...

最新文章

  1. 1分钟快速生成用于网页内容提取的xslt
  2. 009_Get请求中文乱码
  3. pc工具不支持stb的加密方式_如何选择加密狗?九大标准
  4. springboot启动过程_spring5/springboot2源码学习 -- spring boot 应用的启动过程
  5. “我,程序员,33岁,距离退休,只剩2年了!”
  6. 2.12linux csf 防火墙 防止少量的ddos cc攻击
  7. python数据分析框架
  8. 动态表单 mysql_动态表单实现思路
  9. Halcon实现Otsu最大类间方差法
  10. http 502错误怎么解决?
  11. InputStreamReader乱码
  12. android原生TTS+语音引擎 实现纯离线 免费的中英TTS
  13. Excel/Word 插入图表 InvokeMember设置图表类型
  14. zabbix与nagios对比
  15. 怎么把计算机里的文件放到桌面上,ipad怎么把文件放到桌面
  16. 单目标跟踪SiamMask:特定目标车辆追踪 part2
  17. 阿里巴巴鸿蒙系统,都说鸿蒙系统要比阿里YunOS更容易成功,到底容易在哪些方面?...
  18. JDK源码中,都有哪些NB的设计模式?
  19. 四川省通江中学2021年高考成绩查询,「通江中学」2021年年通江中学升学率高不高?...
  20. 谷歌浏览器内核Cef js代码整理(一)

热门文章

  1. Filecoin官方:8.12矿工线上会议记录 | 中链云
  2. 表格的列标题具有排序功能可便于读者查阅
  3. Google Bigtable (中文版)
  4. postgres9.5.7 wal日志归档和任意时间点恢复数据
  5. docker 安装 rabbitmq详细与遇到错误解决
  6. 基于PreSCAN Matlab/Simulink的智能驾驶联合仿真【详细图文】
  7. 爱看广场舞的老爷爷的笔记 --shell命令
  8. 白话完全解析动态规划原理及相关问题(二)
  9. 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
  10. 如何在项目管理中定义可交付成果?