我正在尝试将我自己的程序添加到一个小型linux中,它是用Buildroot创建的。我到目前为止所做的事:
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))(inspiration 来源) HelloWorld目录包含: main.c & Makefile:
main.c :
#include <stdio.h>
int main()
{
printf("\nMain entry.\n");
return 0;
}Makefile:
CC=gcc
CFLAGS=-I.
all: *.c
$(CC) -Os -Wall *.c -o helloworld
# $(STRIP) helloworld
clean:
rm -f a.out helloworld
rm -f *.o编辑:我还在'package/Config.in‘中添加了源代码"package/ HelloWorld /Config.in“,但是当我安装分区时,我无法在/usr/bin中找到自己的HelloWorld可执行文件.,我对此非常陌生,也没有任何先验知识,所以请您向我解释一下,我缺少什么,因为我肯定做错了什么。
UPDATE:程序构建并安装在所需的位置,但是当我尝试像这样运行:./helloworld,I get:bash: ./helloworld: No such file or directory,它有执行权限。这是怎么回事?(我试图在将rootfs.ext2挂载到ubuntu目录后运行它,构建器的目标是i386,所以应该可以,对吧?)
在构建和安装HelloWorld程序并最终运行它之后,我想添加到init.d中,以便它在引导后启动,并将HelloWorld替换为不需要X服务器的Qt窗口,比如这里。
灵感的主要来源这里。
发布于 2017-12-05 15:13:21
在2016.05上的最小测试示例
上游GitHub:https://github.com/cirosantilli/buildroot/tree/in-tree-package-2016.05
此示例在树中添加包源,这对于教育目的和如果您想要合并回(kudos!)的方法都很简单
如果您不打算将其合并回(booooh!),则更有可能希望将Buildroot用作git子模块,并且:
BR2_EXTERNAL的树外包,如:https://github.com/cirosantilli/buildroot/tree/out-of-tree-2016.05所示*_OVERRIDE_SRCDIR +其他git子模块,请参见:如何修改用于包开发的Buildroot包的源代码?修改的文件:
包裹/配置
menu "Misc"
source "package/hello/Config.in"
endmenu包/hello/Config.in
config BR2_PACKAGE_HELLO
bool "hello"
help
Hello world package.
http://example.com包裹/hello/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))包/hello/src/..gitignore
hello包/hello/src/Makefile
CC = gcc
.PHONY: clean
hello: hello.c
$(CC) -o '$@' '$<'
clean:
rm hello包/hello/src/hello.c
#include <stdio.h>
int main(void) {
puts("hello");
}用法:
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来自qemu内部:
hello预期产出:
hello在Ubuntu 16.04测试。
发布于 2013-11-05 08:56:08
通常,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目录后运行它,构建器的目标是i368,所以应该可以,对吧?)
不,不是这样的。您不能仅仅挂载rootfs.ext2并期望从它运行程序。除其他外,这是因为rootfs.ext2中的程序是针对rootfs.ext2中的库编译的,但是如果您这样运行它,它将使用/usr/lib中的库。您要么必须完全使用rootfs.ext2引导系统,要么使用qemu,要么使用chroot环境。对于chroot,您应该使用'tar‘文件系统格式,而不是ext2。另见此处:色色
https://stackoverflow.com/questions/19783795
复制相似问题