Ale*_*ruC 17 linux qt makefile uclinux buildroot
我正在尝试将自己的程序添加到使用Buildroot创建的小型Linux中.到目前为止我做了什么:
我在'buildroot/package /'中创建了一个名为'HelloWorld'的新目录.在'buildroot/package/HelloWorld'里面我有一个:Config.in,HelloWorld.mk和HelloWorld目录. Config.in认为:
config BR2_PACKAGE_HELLOWORLD
bool "helloworld"
default y
help
Hello world component.
Run Code Online (Sandbox Code Playgroud)HelloWorld.mk认为:
HELLOWORLD_VERSION:= 1.0.0
HELLOWORLD_SITE:= /home/userpc/Downloads/helloworld/
HELLOWORLD_SITE_METHOD:=local
HELLOWORLD_INSTALL_TARGET:=YES
define HELLOWORLD_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef
define HELLOWORLD_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin
endef
define HELLOWORLD_PERMISSIONS
/bin/helloworld f 4755 0 0 - - - - -
endef
$(eval $(generic-package))
Run Code Online (Sandbox Code Playgroud)
(灵感来源)HelloWorld目录包含:main.c和Makefile:
main.c:
#include <stdio.h>
int main()
{
printf("\nMain entry.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Makefile文件:
CC=gcc
CFLAGS=-I.
all: *.c
$(CC) -Os -Wall *.c -o helloworld
# $(STRIP) helloworld
clean:
rm -f a.out helloworld
rm -f *.o
Run Code Online (Sandbox Code Playgroud)
编辑:我还在'package/Config.in'中添加了源代码"package/HelloWorld/Config.in"但是当我挂载rootfs.ext2分区时,我无法在/ usr/bin ..中找到我的HelloWorld可执行文件,我对此非常陌生并且没有任何先验知识,所以你能否向我解释一下,我从中错过了什么,因为我确定我做错了什么.
更新:程序构建并安装在所需的位置,但是当我尝试运行它时:./ helloworld,我得到:bash:./ helloworld:没有这样的文件或目录,它有执行权..什么事用它?(我将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标arch是i368,所以它应该没问题,对吧?)
建筑和安装HelloWorld程序,并最终它运行后,我想加入的init.d所以开机后启动,并更换一个Qt窗口的HelloWorld不需要一个X服务器,像这样的事情在这里.
这里灵感的主要来源.
通常,buildroot包的源代码来自(下载的)tarball.你现在正在做什么(将源放在package/HelloWorld中)不是正确的方法.
Buildroot确实有"本地"包源的条款,如果你真的需要,你可以使用它.你需要HELLOWORLD_SITE_METHOD变量.
有关更多信息,请参阅http://buildroot.uclibc.org/downloads/manual/manual.html#adding-packages.
此外,您无需定义HELLOWORLD_DIR,HELLOWORLD_BINARY,HELLOWORLD_TARGET_BINARY.
更新:关于您的其他问题:
更新:程序构建并安装在所需的位置,但是当我尝试运行它时:./ helloworld,我得到:bash:./ helloworld:没有这样的文件或目录,它有执行权..什么事用它?(我将rootfs.ext2挂载到ubuntu目录后尝试运行它,buildroot的目标arch是i368,所以它应该没问题,对吧?)
不,它不会那样工作.您不能只挂载rootfs.ext2并期望从中运行程序.除其他之外,这是因为rootfs.ext2中的程序是针对rootfs.ext2中的库编译的,但是如果你这样运行它将使用/ usr/lib中的库.您必须使用rootfs.ext2完全启动系统,使用qemu或使用chroot环境.对于chroot,您应该使用'tar'文件系统格式,而不是ext2.另见:http: //buildroot.uclibc.org/downloads/manual/manual.html#_chroot
最小的测试示例在2016.05之上
GitHub上游:https: //github.com/cirosantilli/buildroot/tree/in-tree-package-2016.05
此示例在树中添加了包源,这对于教育目的而言很简单,但不是常见的用例.
在实际项目中,您更有可能希望将Buildroot用作git子模块,并且:
BR2_EXTERNAL如下所示:https://github.com/cirosantilli/buildroot/tree/out-of-tree-2016.05*_OVERRIDE_SRCDIR+其他git子模块,如下所述:如何修改用于包开发的Buildroot包的源代码? 文件已修改:
包/ Config.in:
menu "Misc"
source "package/hello/Config.in"
endmenu
Run Code Online (Sandbox Code Playgroud)
包/你好/ Config.in:
config BR2_PACKAGE_HELLO
bool "hello"
help
Hello world package.
http://example.com
Run Code Online (Sandbox Code Playgroud)
包/你好/ hello.mk:
################################################################################
#
# hello
#
################################################################################
HELLO_VERSION = 1.0
HELLO_SITE = ./package/hello/src
HELLO_SITE_METHOD = local
define HELLO_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D)
endef
define HELLO_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/hello $(TARGET_DIR)/usr/bin
endef
$(eval $(generic-package))
Run Code Online (Sandbox Code Playgroud)
包/你好/ SRC /的.gitignore:
hello
Run Code Online (Sandbox Code Playgroud)
包/你好/ SRC /生成文件:
CC = gcc
.PHONY: clean
hello: hello.c
$(CC) -o '$@' '$<'
clean:
rm hello
Run Code Online (Sandbox Code Playgroud)
包/你好/ SRC/hello.c中:
#include <stdio.h>
int main(void) {
puts("hello");
}
Run Code Online (Sandbox Code Playgroud)
用法:
make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_HELLO=y' >> .config
make BR2_JLEVEL=2
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
Run Code Online (Sandbox Code Playgroud)
从qemu内部:
hello
Run Code Online (Sandbox Code Playgroud)
预期产量:
hello
Run Code Online (Sandbox Code Playgroud)
在Ubuntu 16.04中测试过.