如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额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).