Msys2构建HelloWorld工程
以最简单的HelloWorld.c为例,为您展示交叉编译的完整过程,方便为更复杂的项目奠定基础。
准备工作
- 安装MSYS2
- MinGW
- RealEvo-IDE(仅需要IDE生成编译Base工程的参数信息)
操作步骤
具体操作步骤如下所示。
- 以Zyzq7000平台为例,通过RealEvo-IDE获取到该平台编译程序的参数数据。先使用RealEvo-IDE创建一个SylixOS Base工程,参数设置如下,完成创建。
- 编译工程,完成之后,在Console获取Zynq7000平台编译器、编译参数等信息,部分信息如下所示。
arm-sylixos-eabi-gcc -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=auto -mno-unaligned-access -fno-strict-aliasing \
-O2 -g1 -gdwarf-2 -Wall -fmessage-length=0 -fsigned-char -fno-short-enums -fPIC -DSYLIXOS \
-I"E:/Workspace/base-zynq7000/libsylixos/SylixOS" -I"E:/Workspace/base-zynq7000/libsylixos/SylixOS/include" \
-I"E:/Workspace/base-zynq7000/libsylixos/SylixOS/include/network" -MMD -MP -MF Release/dep/test/src/test.d \
-c src/test.c -o Release/obj/test/src/test.o
arm-sylixos-eabi-gcc -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=auto -nostdlib -Wl,-shared -fPIC -shared \
Release/obj/test/src/test.o -L"E:/Workspace/base-zynq7000/libsylixos/Release" \
-L"E:/Workspace/base-zynq7000/libsylixos/Debug" -L"E:/Workspace/base-zynq7000/libcextern/Release" \
-L"E:/Workspace/base-zynq7000/libcextern/Debug" -L"E:/Workspace/base-zynq7000/libcextern/Release" \
-lcextern -lvpmpdm -lm -lgcc -o Release/test
- 任意文件下创建并编写HelloWorld.c文件。
编辑HelloWorld.c,输入以下程序。
#include<stdio.h>
int main(int argc, char** argv)
{
printf("Hello SylixOS!\n");
return (0);
}
- 打开msys2终端,进入HelloWorld源码目录,参考Base工程编译参数和过程,对HelloWorld.c文件进行编译生成HelloWorld.o文件,然后进行连接,最终生成HelloWorld可执行文件。部署HelloWorld文件到Zyzq7000平台即可运行测试。
[root@sylixos:/root]# cd /apps/helloworld/
[root@sylixos:/apps/helloworld]# ls
HelloWorld
[root@sylixos:/apps/helloworld]# ./HelloWorld
Hello SylixOS!
[root@sylixos:/apps/helloworld]#
编译要点说明:
- 编译命令
根据目标平台选择交叉编译器,这里使用的是arm编译器arm-sylixos-eabi-gcc。
- 编译参数
SylixOS在不同平台下的编译参数有所不同,根据选择的硬件平台进行编写。具体编译参数可通过RealEvo-IDE编译Base程序时的打印信息获取。
arm-sylixos-eabi-gcc -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=auto -mno-unaligned-access -fno-strict-aliasing \
-O2 -g1 -gdwarf-2 -Wall -fmessage-length=0 -fsigned-char -fno-short-enums -fPIC -DSYLIXOS -c HelloWorld.c \
-o HelloWorld.o
- 头文件路径
SylixOS系统头文件在Base工程下,编译时,需要使用 -I
参数指定相关路径。需要将所有的路径替换成自己电脑上Base工程实际路径。并且注意目录分割符号。
-I"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libsylixos/SylixOS"
-I"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libsylixos/SylixOS/include"
-I"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libsylixos/SylixOS/include/network"
- 链接
SylixOS在不同平台下的连接参数有所不同,根据选择的硬件平台进行编写。具体连接参数可通过RealEvo-IDE编译Base程序时的打印信息获取。
arm-sylixos-eabi-gcc -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=auto -nostdlib -Wl, \
-shared -fPIC -shared HelloWorld.o -lcextern -lvpmpdm -lm -lgcc -o HelloWorld
- 库文件路径
连接时需要用到Base过程编译出的静态库和动态库,需要通过-L选项指明库路径。需要将所有的路径替换成自己电脑上Base工程实际路径。并且注意目录分割符号。
-L"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libsylixos/Release"
-L"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libsylixos/Debug"
-L"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libcextern/Release"
-L"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libcextern/Debug"
-L"D:/SylixOS_WS/test_driver/Base_ARM_A9_R_253/libcextern/Release"
总结 :
使用msys2编译SylixOS程序过程与Linux下交叉编译软件的方法基本一致,这里需要注意的是SylixOS特殊的编译链接参数,并需要先编译Base工程。