QNX学习笔记-使用脚本编译qnx代码,不用IDE也能编译代码

141 篇文章 22 订阅
106 篇文章 5 订阅

如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额1元起步,多少随意



锋影

e-mail 174176320@qq.com


Momentics IDE不用安装就能用。
但,事情果然没有那么简单,证书失效,第二次打开同一份工程看不了文件。我的内心是崩溃的。

命令行

然后我就只能用命令行了。 
一份批处理文件:

call c:\qnx660\qnx660-env.bat

E:

cd E:\code
  • 1
  • 2
  • 3
  • 4
  • 5

拖动到cmd中,直接回车运行,相关的qnx变量设置好:

D:\>call c:\qnx660\qnx660-env.bat
D:\>REM  This script is sets environment variables requires to use this version of QNX Software Development Platform 6.6
D:\>REM  from the command line.
D:\>REM
D:\>set QNX_TARGET=C:\qnx660\target\qnx6
D:\>set QNX_TARGET=C:/qnx660/target/qnx6
D:\>set QNX_HOST=C:\qnx660\host\win32\x86
D:\>set QNX_HOST=C:/qnx660/host/win32/x86
D:\>set QNX_CONFIGURATION=C:\qnx660\.qnx
D:\>set MAKEFLAGS=-IC:\qnx660\target\qnx6\usr\include
D:\>set MAKEFLAGS=-IC:/qnx660/target/qnx6/usr/include
D:\>set PATH=C:\qnx660\host\win32\x86\usr\bin;C:\qnx660\.qnx\bin;C:\qnx660\jre\bin;C:\qnx660\host\win32\x86\usr\bin;C:\qnx660\.qnx\bin;C:\qnx660\jre\bin;C:\qnx660\host\win32\x86\usr\bin;C:\qnx660\.qnx\bin;C:\qnx660\jre\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Vim\vim80;D:\TortoiseSVN\bin;C:\qnx660\deployment\qnx-car\deployment\scripts
D:\>set qnxCarDeployment=C:\qnx660\deployment\qnx-car
D:\>if exist C:\qnx660\deployment\qnx-car\qnxcar-env.bat C:\qnx660\deployment\qnx-car\qnxcar-env.bat
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接着,就能在E盘下使用一些qnx命令了。

重要的头文件

在 ${QNX_TARGET}/usr/include 下有许多不同用途的头文件。

arpa

和网络相关,比如telnet, internet, ftp. 
例如:C:\qnx660\target\qnx6\usr\include\arpa

hw

描述硬件设备 
例如:C:\qnx660\target\qnx6\usr\include\hw

arm, x86

和cpu、寄存器相关的头文件

C:\qnx660\target\qnx6\usr\include>find . -name *cpu.h
./arm/cpu.h
./io-pkt/machine/cpu.h
./x86/cpu.h
  • 1
  • 2
  • 3
  • 4

和中断相关的*intr.h

C:\qnx660\target\qnx6\usr\include>find . -name "*intr.h"
./arm/intr.h
./intr.h
./io-pkt/machine/intr.h
./io-pkt/nw_intr.h
./x86/intr.h
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

内存函数malloc

C:\qnx660\target\qnx6\usr\include>find . -name malloc*
./malloc.h
./rcheck/malloc.h
./sys/malloc.h
  • 1
  • 2
  • 3
  • 4

net

网络接口相关的头文件 
C:/qnx660/target/qnx6/usr/include/net

netinet,netinet6,netkey

和tcp/ip相关的头文件

C:\qnx660\target\qnx6\usr\include>find . -regex "^\./net[a-z]+[^h]$"
./netdrvr
./netinet
./netinet6
./netipsec
./netkey
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

呀,找多了,只有netinet,netinet6,netkey哈。

编译arm、x86的hello world

写一份非常简单的C代码hello.c

#include <stdio.h>
int main(){
    puts("hello world!");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5

然后用qcc针对arm, x86两种架构的处理器各编译得到一份可执行文件。 
x86是默认的: 
E:\share\learn\helloT>qcc hello.c 
这样得到的a.out就是x86的可执行文件。 
接着,用qcc查看其支持的平台:

E:\share\learn\helloT>qcc -V
cc: targets available in C:/qnx660/host/win32/x86/etc/qcc:
        4.7.3,gcc_ntoarmv7le
        4.7.3,gcc_ntoarmv7le_cpp-ne
        4.7.3,gcc_ntoarmv7le_cpp
        4.7.3,gcc_ntoarmv7le_gpp
        4.7.3,gcc_ntox86        (default)
        4.7.3,gcc_ntox86_cpp-ne
        4.7.3,gcc_ntox86_cpp
        4.7.3,gcc_ntox86_gpp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

编译arm的可执行文件: 
E:\share\learn\helloT>qcc -V 4.7.3,gcc_ntoarmv7le hello.c -o helloArm 
我将a.out放到qnx虚拟机上,并将helloArm放到样机上,两者皆可正常运行。

test_macros

这一部分讨论测试宏,和qnx的关系不大。 
怎样用gcc编译带测试宏的文件? 
设定测试宏有两种方法,一个是用gcc的D选项,另一个是在文件中宏定义。 
比如 
(1) 
在文件中宏定义

#define REST 1
#include <stdio.h>
int main(){
#ifdef REST
        printf("REST: %d\n",REST);
#else 
        puts("busy!");
#endif
        return 0;
}
/*
[edemon@CentOS workspace]$ gcc macro.c -o macro
[edemon@CentOS workspace]$ ./macro
REST: 1
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

等价于: 
用gcc -D设定

#include <stdio.h>
int main(){
#ifdef REST
        printf("REST: %d\n",REST);
#else 
        puts("busy!");
#endif
        return 0;
}
/*
[edemon@CentOS workspace]$ gcc -DREST macro.c -o macro
[edemon@CentOS workspace]$ ./macro
REST: 1
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

(2)

#define _POSIX_C_SOURCE 199506
#include <stdio.h>
int main(){
        printf("_POSIX_C_SOURCE: %d\n",_POSIX_C_SOURCE);
        return 0;
}
/*
[edemon@CentOS workspace]$ gcc macro.c -o macro
[edemon@CentOS workspace]$ ./macro
_POSIX_C_SOURCE: 199506
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

等价于

#include <stdio.h>
int main(){
        printf("_POSIX_C_SOURCE: %d\n",_POSIX_C_SOURCE);
    return 0;
}
/*
[edemon@CentOS workspace]$ gcc -D_POSIX_C_SOURCE=199506 macro.c -o macro
[edemon@CentOS workspace]$ ./macro
_POSIX_C_SOURCE: 199506
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

默认情况下:

#include <stdio.h>
int main(){
        printf("_POSIX_C_SOURCE: %d\n",_POSIX_C_SOURCE);
    return 0;
}
/*
[edemon@CentOS workspace]$ gcc macro.c -o macro
[edemon@CentOS workspace]$ ./macro
_POSIX_C_SOURCE: 200809
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(Since glibc 2.10) The value 200809L or greater exposes definitions corresponding to the POSIX.1-2008 
base specification (excluding the XSI extension).


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值