Как собрать несколько исходных файлов в rootfs во встроенном Linux?

У меня есть простое приложение c

Файл Ctest.c

#include <stdio.h>
#include "new.h"
#include "new.c"

int main()
{
    switching();
    return 0;
}

и у меня есть файлы new.c и new.h.

файл new.h как

void switching();

и мой файл new.c как

void switching(){
    char grade ='B';
    switch(grade){
        case 'A':
            printf("Excellent\n");
            break;
        case 'B':
            printf("Super\n");
            break;
        case 'C':
            printf("Well done\n");
            break;
        case 'D':
            printf("You passed\n");
            break;
        case 'F':
            printf("Better try again");
            break;
        default:
            printf("invalid grade");
            break;
    }

    printf("your grade is %c \n",grade);

    }

Когда я пытаюсь использовать команды сборки в своем встроенном инструменте Linux для компиляции и создания двоичного файла, сборка завершается ошибкой, и вот мой измененный файл make для приложения на rootfs.

сделать файл для приложения Ctest:

APP  = Ctest


# Add any other object files to this list below

APP_OBJS = Ctest.o
APP_OBJS += new.o


all: build

build: $(APP)

$(APP): $(APP_OBJS)
    $(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS)

Вот мой журнал ошибок во время компиляции

    DEBUG: Executing shell function do_compile
NOTE: make -j 4
ERROR: oe_runmake failed
aarch64-xilinx-linux-gcc  --sysroot=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/plnx_aarch64 -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/work/aarch64-xilinx-linux/Ctest/1.0-r0=/usr/src/debug/Ctest/1.0-r0 -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/x86_64-linux= -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/plnx_aarch64=   -c -o Ctest.o Ctest.c
aarch64-xilinx-linux-gcc  --sysroot=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/plnx_aarch64 -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/work/aarch64-xilinx-linux/Ctest/1.0-r0=/usr/src/debug/Ctest/1.0-r0 -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/x86_64-linux= -fdebug-prefix-map=/home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/sysroots/plnx_aarch64=   -c -o new.o new.c
new.c: In function 'switching':
new.c:5:13: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
             printf("Excellent\n");
             ^~~~~~
new.c:5:13: warning: incompatible implicit declaration of built-in function 'printf'
new.c:5:13: note: include '<stdio.h>' or provide a declaration of 'printf'
new.c:24:5: warning: incompatible implicit declaration of built-in function 'printf'
     printf("your grade is %c \n",grade);
     ^~~~~~
new.c:24:5: note: include '<stdio.h>' or provide a declaration of 'printf'
Ctest.c:33:17: fatal error: new.h: No such file or directory
 #include "new.h"
                 ^
compilation terminated.
make: *** [<builtin>: Ctest.o] Error 1
make: *** Waiting for unfinished jobs....
ERROR: Function failed: do_compile (log file is located at /home/janani/projects/peta2017.1-zcu102/zcu102/petlnx_zcu102/build/tmp/work/aarch64-xilinx-linux/Ctest/1.0-r0/temp/log.do_compile.19737)

Я понял, что мне нужно внести изменения в файл make или файл bitbake, которые создают приложение, т.е. файл Ctest.bb. Если да, то какие изменения? А у меня петалинукс 2017.1.

файл bitbake приложения

#
# This file is the Ctest recipe.
#

SUMMARY = "Simple Ctest application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://Ctest.c \
       file://new.c \
       file://Makefile \
      "

S = "${WORKDIR}"

do_compile() {
         oe_runmake
}

do_install() {
         install -d ${D}${bindir}
         install -m 0755 Ctest ${D}${bindir}
         install -m 0755 new ${D}${bindir}
}

Как я могу передать файл new.h в файл make или мне нужно изменить файл bitbake?


person jenny    schedule 24.07.2017    source источник
comment
Компиляция происходит в каталоге, отличном от исходного? Если да, то CFLAGS+=-I/path/to/where/source/is   -  person Fox    schedule 24.07.2017
comment
.c файлы не включены, а скомпилированы отдельно. Пожалуйста, поймите основы правильно; книга C поможет много.   -  person too honest for this site    schedule 25.07.2017


Ответы (1)


Ваш файл Ctest.c включает new.c, так что вам вообще не следует пытаться собрать new.o. Удалить строку

APP_OBJS += new.o

а также

install -m 0755 new ${D}${bindir}

Вы не предоставляете файл new.h в своем SRC_URI. Измените его на

SRC_URI = "file://Ctest.c \
   file://new.c \
   file://new.h \
   file://Makefile \
"
person meuh    schedule 24.07.2017
comment
Вы рекомендуете совершенно не то. .c файлы не должны быть включены в другие файлы. Это очень плохая практика. - person too honest for this site; 25.07.2017
comment
@ Олаф, я согласен с тобой, это не очень хорошая идея. Я просто отвечал на вопрос относительно yocto. Я уверен, что со временем постер получит лучшую реализацию. - person meuh; 25.07.2017
comment
Я не понимаю, как это связано с yocto. Это неправильный подход, вот и все. - person too honest for this site; 25.07.2017
comment
Вы создаете new.o, поэтому вам не нужно включать new.c в Ctest.c, это и ответило бы на вопрос, и предотвратило бы плохую практику. - person Matthew M.; 19.02.2020