我已经编写了一个相当大的 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'
这是一个函数调用。