私はすでに書いたかなり大きな C プログラムを持っています。私は今、同僚が書いた C++ クラスを利用するように求められています。私は Python での作業に慣れているため、C でアプリケーションを作成し、C++ で作業するように求められると、頭痛の種になります。そのため、メインのアプリケーションを無視して、いくつかの調査を行うことにし、C++ クラスを呼び出す非常に単純な C プログラムの実行方法を示す YouTube ビデオに出くわしました。
C プログラムをコンパイルして C++ ファイルを呼び出せるようにするには、2 つのことを行う必要がありました。1) C++ コンパイラ (g++) を使用し、c++ 関数を < extern "C"> で囲むようにします。これにより、問題なくアプリケーションをコンパイルして実行することができました。
ここに私が現在使用しているファイルがあります。
cppObject.cpp
cppObject.h
cppFunctions.cpp
cppFunctions.h
test.c
「test.c」は、cppObject.cpp 内の関数を参照する cppFunctions クラスを呼び出すメイン メソッドがある場所です。これを使用して問題なくコンパイルできるので、これらの各関数に入る必要はないと思います。
g++ cppObject.cpp cppFunctions.cpp test.c -o test_exc
これにより、問題なく実行できる実行可能ファイルが生成されます。
これは Petalinux でビルドされているため、Petalinux は bitbake ファイルと makefile を含むレシピ アプリを生成します。私の目標を達成するには、どちらも何らかの方法で変更する必要があります。
このテスト ケースを使用して、メイン アプリケーションを参照します。
私の 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に基づいて、テストアプリケーションのファイル名とgccの代わりにg ++を使用して、同じことを試みました
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'
これは関数呼び出しです。