iMX6ULL QT 環境構築 | CMake クロスコンパイル環境の構築と Linux での利用

私は cmake の使用に慣れており、手書きの Makefile の時代には戻りたくありません。cmakeを使うと手書きのmakefileに比べて電動化が実現しているようで、プロジェクトのコンパイル管理が非常に簡単になります。また、cmake は非常に人気があり、Linux 上の多くのソフトウェア ソース コード パッケージは cmake を使用してコンパイルされています。そこで、組み込みLinux環境でcmakeを使用する方法と、組み込みqtのcmake設定についてまとめます。

CMake の概要

CMake とは
GNU Make、QT の qmake、Microsoft の MS nmake、BSD Make (pmake)、Makepp など、いくつかの Make ツールについて聞いたことがあるかもしれません。これらの Make ツールはさまざまな規範や標準に従っており、実行される Makefile の形式は大きく異なります。これは深刻な問題を引き起こします。ソフトウェアがクロスプラットフォームであることを望む場合、異なるプラットフォーム上でコンパイルできることが保証されなければなりません。また、上記の Make ツールを使用する場合は、規格ごとに Makefile を作成する必要があり、これは大変な作業になります。また、Makefile を手動で作成するのは簡単ではありません。

CMake は、上記の問題に対処するために設計されたツールです。まず、開発者がプラットフォームに依存しない CMakeList.txt ファイルを作成してコンパイル プロセス全体をカスタマイズできるようにし、その後、ターゲット ユーザーのプラットフォームに応じて、必要なローカライズされた Makefile とプロジェクト ファイルをさらに生成します。 Unix の場合は Makefile、Windows の場合は Visual Studio プロジェクトなど。「一度書けばどこでも実行できる」を実現するために。明らかに、CMake は、上記の make よりも高度なコンパイルおよび構成ツールです。プロジェクト アーキテクチャ システムとして CMake を使用するよく知られたオープン ソース プロジェクトには、VTK、ITK、KDE、OpenCV、OSG などが含まれます。

CMake を使用して Makefile を生成し、Linux プラットフォームでコンパイルするプロセスは次のとおりです。
1. CMake 構成ファイル CMakeLists.txt を書き込みます。
2. コマンド cmake PATH または ccmake PATH を実行して Makefile (ccmake と の違いcmake は、前者は対話型インターフェイスを提供することです) を生成します。これは、  PATH CMakeLists.txt が配置されるディレクトリです。
3. make コマンドを使用してコンパイルします。

cmakeのインストール

ダウンロード | CMake

Linux での cmake のインストールは非常に簡単です。ubuntuを例に挙げると、直接 sudo apt-get install cmake を実行できます。もちろん、最新のソース パッケージを手動でダウンロードしてインストールすることもできます。ここでは最も簡単な方法を選択します。

sudo apt-get install cmake

cmakeクロスコンパイル環境での設定

cmake で使用されるクロスコンパイル ツールチェーンを指定します (オプション: DCMAKE_TOOLCHAIN_FILE)。

プロジェクトのルート ディレクトリの下に新しい Toolchains ディレクトリを作成し、このディレクトリに他の開発ボードの設定ファイルを参照し、この開発ボード用の設定ファイル arm-poky-linux-gnueabi.cmake を追加します。

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER "arm-poky-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-poky-linux-gnueabi-g++")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")

# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")

cmakeは使用します

新しい cmake_test プロジェクト フォルダーを作成し、その中に新しい hello.c ファイルのソース コードを作成します。

#include <stdio.h>

int main(){
    printf("hello world\n");
    return 0;
}

CMakeLists.txt ファイルを作成します。コメントアウトされた内容は無視できますが、実際には内容はほとんどありません。

cmake_minimum_required(VERSION 3.12)

project(HELLO)

#add_definitions(
 #   -D_ENABLE_LOGGING
#)

set(SRC_LIST hello.c)

#add library(libhello SHARED hello.c)
#set_target_properties(libhello PROPERTIES OUTPUT NAME "hello")
add_executable(hello ${SRC_LIST})
#target_link_libraries(hello libhello)

コンパイルを開始する 

プロジェクトのルート ディレクトリの下に build ディレクトリを作成し、次に cd build し、最初に build ディレクトリに入ります。-DCMAKE_TOOLCHAIN_FILE を指定する必要があることに注意してください。

#先加载环境变量
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 

#在项目根目录,cd build,先进入build目录
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-poky-linux-gnueabi.cmake ../

最後に、ボード上で実行できる実行可能ファイルが生成されます。

QT クロスコンパイル環境の cmake スクリプト

サンプルデモ、main.cpp:

#include <QCoreApplication>
#include<QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "hello QT test";
    return a.exec();
}

QT プロジェクトのクロスコンパイル環境の cmake スクリプト:

cmake_minimum_required(VERSION 3.12)

project(helloqt)

add_definitions(
    -D_ENABLE_LOGGING
)

#set(CMAKE_PREFIX_PATH "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/cmake")

set(BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../build_out)
get_filename_component(ABSOLUTE_PATH ${BUILD_DIRECTORY} ABSOLUTE)
set(BUILD_DIRECTORY ${ABSOLUTE_PATH})


####################  QT dependencies ####################
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(QT_VERSION 5)
set(CMAKE_CROSSCOMPILING TRUE)
set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin)

set(REQUIRED_LIBS Core Quick Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Quick Qt5::Widgets)

####################  set output directory ####################
set(BUILD_DIR ${BUILD_DIRECTORY})
set(LIB_DIR ${BUILD_DIR}/lib/Release)
#set(LIB_FIX)
#if (CMAKE_BUILD_TYPE MATCHES "Debug")
#    set(LIB_DIR ${BUILD_DIR}/lib/Debug)
#    set(LIB_FIX _d)
#endif ()

#get_filename_component(ABSOLUTE_PATH ${LIB_DIR} ABSOLUTE)
#set(LIB_DIR ${ABSOLUTE_PATH})

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR})
set(CMAKE_PDB_OUTPUT_DIRECTORY ${LIB_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIB_DIR})

#set(LIB_DIR_FIX ${LIB_DIR})
#option(USE_VS_BUILD "use visual studio build." OFF)
#if (USE_VS_BUILD)
#    set(LIB_DIR_FIX ${LIB_DIR}/bin/Debug)
#endif ()
###########set include path ####################
include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/
        ${BUILD_DIR}/include
)

####################  scan source files ####################
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/ SRC_FILES)
#aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source/cpp/test2 SRC_FILES)

#set(SRC_LIST hello.c)

#add library(libhello SHARED hello.c)
#set_target_properties(libhello PROPERTIES OUTPUT NAME "hello")
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
#find_package(Qt5 COMPONENTS Widgets)

add_executable(${PROJECT_NAME}  ${SRC_FILES})
#target_link_libraries(hello libhello)


####################  set target dependencies ####################

set(THIRD_LIBS "")

target_link_libraries(${PROJECT_NAME} PRIVATE ${REQUIRED_LIBS_QUALIFIED} ${THIRD_LIBS})

エラーメッセージ

エラーの解決策

エラー プロンプトによると、プロンプトは OE_QMAKE_PATH_EXTERNAL_HOST_BINS 変数が CMake で見つからないことを示しています。これは、クロスコンパイル環境に正しい OpenEmbedded (OE) 環境変数が設定されていないためです。

次の行を CMakeLists.txt ファイルに追加して、OE_QMAKE_PATH_EXTERNAL_HOST_BINS 変数を設定できます。その目的は、qmake の場所を見つけることです。したがって、次のように設定できます。

set(QT_VERSION 5)
set(CMAKE_CROSSCOMPILING TRUE)
set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin)

コンパイルを開始する 

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-poky-linux-gnueabi.cmake -DCMAKE_PREFIX_PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/cmake ../

上記のコマンド文字列が少し長いと思われる場合は、-DCMAKE_PREFIX_PATH を CMakeLists.txt ファイルに書き込むことができます。次のようになります (「」の有無にかかわらず):

set(CMAKE_PREFIX_PATH "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/cmake")

ついにコンパイルが成功しました!最後に、cmake を使用して組み込み環境で qt プロジェクトをコンパイルできるようになります。qtcreator の巨大な IDE をインストールして使用したくない場合。または、スクリプトを使用して qt プロジェクトをコンパイルする場合は、cmake を使用するのが良い選択です。

上記の操作の後、helloqt 実行可能ファイルが正常に生成されます。このファイルを開発ボードに置くと、実行結果が確認できます。生成された実行可能ファイルの場所は、build_out/lib/Release/ パスの下にあります。

その他のリソース

https://m.elecfans.com/article/2012326.html

CMAKE (Linux プラットフォーム) の導入と使用_cmake linux_L888666Q のブログ - CSDN ブログ

【cmake実戦1】Linuxにcmakeをインストールする2つの方法

cmake の超詳細な入門チュートリアル_cmake コンパイル process_yygr のブログ-CSDN ブログ

VSCode+cmake+GDB+gdbserver を使用して IMX6ULL の Linux C アプリケーションをデバッグする

おすすめ

転載: blog.csdn.net/qq8864/article/details/132424908