源码如下:
#include
/* 执行命令: ./hello zhiguoxin
* argc = 2
* argv[0] = ./hello
* argv[1] = zhiguoxin
*/
int main(int argc, char **argv)
{
if (argc >= 2)
printf("Hello, %s!\n", argv[1]);
else
printf("Hello, world!\n");
return 0;
}
gcc -o hello hello.c
./hello
Hello, world!
./hello zhiguoxin
Hello, zhiguoxin!
上述命令编译得到的可执行程序 hello 可以在 Ubuntu 中运行,
执行file hello
命令就可以看到hello是64位LSB的ELF格式文件,目标机架构为x86-64,说明这个可执行文件只能在PC机上执行。
但是如果把它放到 ARM 板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86 的。我们要想给 ARM 板编译出 hello 程序,需要使用交叉编译工具链,交叉编译的工具链我们已经安装过了,详细请看【正点原子】I.MX6U 嵌入式Linux驱动开发指南V1.x.pdf 的第 4.3 小节
。我是用的是arm-linux-gnueabihf交叉编译工具链。使用arm-linux-gnueabihf-gcc -v
可以查看交叉编译工具链的版本号。
然后就可以使用下面命令编译出可以在ARM板子上运行的可执行文件了。
arm-linux-gnueabihf-gcc -o hello hello.c
这样编译出来的 hello 程序才可以在 ARM 板子上运行。执行file hello
命令就可以看出hello是32位 LSB 的 ELF 格式文件,目标机架构为ARM,说明这个交叉编译正常,可执行文件可以在ARM板上执行。
开发板启动后通过nfs挂载Ubuntu目录的方式,将相应的文件拷贝到开发板上。简单来说,就是通过NFS在开发板上通过网络直接访问ubuntu虚拟机上的文件,并且就相当于自己本地的文件一样。
开发板想访问/home/zhiguoxin/myproject/100ask_app_development_source
这个目录中的文件,就要把/home/zhiguoxin/myproject/100ask_app_development_source
挂载到开发板的mnt
目录,这样就可以通过nfs来访问/home/zhiguoxin/myproject/100ask_app_development_source
了。
因为我的代码都放在/home/zhiguoxin/myproject/100ask_app_development_source
这个目录下,所以我们将这个目录作为NFS共享文件夹。设置方法参考移植SQLite3、OpenCV到RV1126开发板上开发人脸识别项目第一章。
Ubuntu IP为 192.168.10.100,然后一般都是挂载在开发板的mnt目录下,这个目录是专门用来给我们作为临时挂载的目录。
然后使用MobaXterm软件通过SSH访问开发板。
ubuntu ip:192.168.10.100
windows ip:192.168.10.200
开发板ip:192.168.10.50
在开发板上执行以下命令:
mount -t nfs -o nolock,vers=3 192.168.10.100:/home/zhiguoxin/myproject/100ask_app_development_source /mnt
就将开饭的mnt
目录挂载在ubuntu的/home/zhiguoxin/myproject/100ask_app_development_source
目录下了。这样我们就可以在Ubuntu下修改文件,然后可以直接在开发板上执行可执行文件了。当然我这里的/home/zhiguoxin/myproject/
和windows
之间是一个共享目录,我也可以直接在windows
上面修改文件,然后ubuntu和开发板直接进行文件同步了。
然后编译,可以编译成功
一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等 4 步才能变成可执行文件。
gcc -E -o hello.i hello.c
gcc -S -o hello.s hello.i
gcc -c -o hello.o hello.s
gcc -o hello hello.o