2

私はすでに書いたかなり大きな 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'

これは関数呼び出しです。

4

0 に答える 0