2

我已经编写了一个相当大的 C 程序。我现在被要求使用同事编写的 C++ 类。我习惯使用 python,所以用 C 编写我的应用程序,现在被要求使用 C++ 会导致一些偏头痛。所以忽略了我的主要应用程序,我决定做一些研究,并看到一个 youtube 视频,它向我展示了如何做一个非常简单的 C 程序,它调用一个 C++ 类。

为了编译 C 程序并允许它调用 C++ 文件,我需要做两件事,1) 使用 C++ 编译器 (g++) 并确保用 < extern "C"> 包围我的 c++ 函数。通过这样做,我能够毫无问题地编译和运行应用程序。

这是我目前正在使用的文件。

cppObject.cpp
cppObject.h
cppFunctions.cpp
cppFunctions.h
test.c

“test.c”是 main 方法所在的地方,它调用 cppFunctions 类,然后引用 cppObject.cpp 中的函数。现在我认为我不需要进入这些函数中的每一个,因为我可以毫无问题地编译它,使用。

g++ cppObject.cpp cppFunctions.cpp test.c -o test_exc

这会生成一个运行没有问题的可执行文件。

现在因为这是使用 Petalinux 构建的,所以 Petalinux 会生成一个包含 bitbake 文件和 makefile 的 recipe-app。两者都需要以某种方式进行修改以实现我的目标。

我将使用这个测试用例来参考我的主要应用程序。

由于我的 C 应用程序主要是编写、编译和运行,没有任何问题。我决定在它们之后对 makefile 和 bitbake 文件进行建模。

APP = APP_name

# Add any other object files to this list below
APP_OBJS = file1.o \
file2.o \
file3.o \
file4.o \
file5.o \
# ...

all: build

build: $(APP)

LDLIBS += -lm
LDFLAGS += -lpthread

$(APP): $(APP_OBJS)
    $(CC) -o $@ $(APP_OBJS) $(LDFLAGS) $(LDLIBS)
clean:
    rm -f $(APP) *.o

所以基于上面的makefile,我尝试了同样的事情,使用测试应用程序文件名和g++而不是gcc

APP = test

# Add any other object files to this list below
APP_OBJS = cppObject.o cppFunctions.o test.o

all: build

build: $(APP)

$(APP): $(APP_OBJS)
    $(CXX) -o $@ $(APP_OBJS) $(LDFLAGS) $(LDLIBS)
clean:
    rm -f $(APP) *.o

现在与我的原始应用程序匹配的 bitbake 文件看起来像这样。

#
# This file is the **** recipe.
#

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

SRC_URI =   "file://file1.c \
            file://file2.c \
            file://file3.c \
            file://file4.c \
            file://file5.c \
            file://file2.h \
            file://file3.h \
            ...          
            "

S = "${WORKDIR}"

do_compile() {
         oe_runmake
}

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

我最终为测试应用程序制作了这个

#
# This file is the test recipe.
#

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

SRC_URI = "file://cppObject.cpp \
       file://cppFunctions.cpp \
       file://cppObject.h \
       file://cppFunctions.cpp \
       file://test.c \
       file://Makefile \
          "

S = "${WORKDIR}"

do_compile() {
         oe_runmake
}

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

应用程序的 petalinux-build -c 无法构建,主要错误“test.c:2:10: fatal error: cppFunctions.h No such file or directory”

如果我自己设置 makefile 并运行 make,如果我用 C/C++ 文件替换目标文件,它将构建得很好。

我假设正在发生的事情是 Petalinux 使用 bitbake 文件生成目标文件。然后 Makefile 使用它来构建实际的应用程序。

任何可以让我使用 petalinux 构建应用程序的见解。


所以在 .bb 文件中发现了一个错误,@vermaete 也指出了这一点。我离开了 cppFunctions.h 文件。我最终将它添加到 .bb 文件中并重建了配方。不幸的是,我仍然遇到构建错误。但是,它的不同之处在于它存在未定义引用的问题。

undefined reference to 'printObjValue'

这是一个函数调用。

4

0 回答 0