記事ディレクトリ
1.要件の説明
ソフトウェア プロジェクトを開発するとき、通常はバージョン管理を使用します。ソフトウェアがユーザーにリリースされた後、バージョンをアップグレードすると、必然的に一部のユーザーのバージョンが古いバージョンになるため、バージョンごとに異なる変更が加えられます。リリースされると、ユーザーのバージョンを識別するためのバージョン番号が表示されます。このバージョン番号は通常、ビルド構成ファイルに配置されます。たとえば、Android は App ディレクトリの build.gradle ファイルに配置され、CMake ツールを使用します。ビルドされた C/C++ プロジェクトでは、当然のことながら CMakeLists.txt 構成ファイルに配置されます。CMakeLists.txt では、次のステートメントを使用してバージョン番号を宣言します。
project(Tutorial VERSION 2.11)
C/C++ ソース コード内のこのバージョン番号を読み取り、識別のためにサーバーにアップロードするとします。CMakeLists.txt と C/C++ ソース ファイルは異なるシステムに属しているため、直接読み取ることは絶対に不可能です。それで、何をしなければならないのか。この記事では、CMakeLists.txt から設定した値 (バージョン番号だけでなく) を読み取り、C/C++ ソース ファイルでアクセスする方法を紹介します。
2. 要件の準備
2.1 プロジェクトの作成
C/C++ デモ プロジェクトの作成は非常に簡単です。ディレクトリを見つけて、そのディレクトリ内に新しいフォルダーを作成し、以下に示す番号に対応するファイルを作成します。ディレクトリには、ビルドされた製品を保存するためのビルド ディレクトリが含まれています
。スクリプト CmakeLists.txt は、ビルド スクリプト readConfigValue.cpp の値を読み取るために使用される C++ ソース コード ファイルです。次に、IDE を使用してこのディレクトリを開くか、直接書き込むことができます。とにかく、都合のよいことを実行してください。 VScode を使用して開きます。
2.2 CMakeLists.txt ファイルを編集する
CMakeLists.txt ファイルに次のステートメント コードを記述します。
#1.设置最小要求的Cmake版本号
cmake_minimum_required(VERSION 3.10)
#2.设置项目名称
project(ReadConfigValue)
#3.设置项目的版本号,在C++源文件中会读取这个版本号
project(ReadConfigValue VERSION 1.0)
#4.设置C++ 的版本,这里选择的是C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#5.将项目编译成一个可执行文件,Windows上的 .exe文件
add_executable(ReadConfigValue readConfigValue.cpp)
ここでは、主にプロジェクトがスムーズに実行されるかどうかを確認するために、基本的な構成のみが行われます。後でこのファイルを編集して、最終的な要件を完了します。
2.3 C++ ファイルの作成
ReadConfigValue.cpp ファイルに次のコードを記述します。
#include<iostream>
#include<string>
int main(int argc,char* argv[]){
std::cout<<"Hello CMake"<<std::endl;
return 0;
}
2.4 プロジェクトのコンパイルとビルド
作成したプロジェクト ディレクトリを入力し、ビルド ディレクトリを入力し、コマンド ライン ツール CMD を開き、コマンド「
cmake ..
compile project」を入力してから、コマンド「cmake --build .
build project」を入力します。
上記のコマンドを実行すると、コンパイルされたファイルと実行可能ファイルがいくつか生成されます。ファイル:
コマンド ラインで exe ファイルを実行した後、C++ ソース コードに出力される情報は、環境の準備ができていることを証明します。サンプル プロジェクトの出力は次のとおりですHello CMake
。
3. 要件の実現
プロジェクト環境の準備ができたら、ニーズの実装を開始できます。実際、Android Gradle ビルド スクリプトに精通している人は、Android プログラムを作成するときに、BuildConfig というクラスを使用できることに気づくかもしれません。 Android が提供する Gradle プラグインによって生成されます。ここでの CMakeLists.txt 実装は Gradle のメソッドに似ています。ここでの一般的な考え方は、コンパイル中に生成されたヘッダー ファイルに C++ ソース コードに与えたい値を入れ、C++ プログラムでこのヘッダー ファイルを参照することです。それでおしまい。次に、具体的な実装を見てみましょう。
3.1 CMakeLists.txtにログ情報を出力する
message(STATUS 内容)
CMakeLists.txt ファイルを作成するとき、多くの場合、いくつかの情報を出力する必要があります。ここでは、以下に示すように、関数を使用します。
#1.设置最小要求的Cmake版本号
cmake_minimum_required(VERSION 3.10)
#2.设置项目名称
project(ReadConfigValue)
#3.设置项目的版本号,在C++源文件中会读取这个版本号
project(ReadConfigValue VERSION 1.0)
#4.设置C++ 的版本,这里选择的是C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#5.将项目编译成一个可执行文件,Windows上的 .exe文件
add_executable(ReadConfigValue readConfigValue.cpp)
#6.打印调试信息
message(STATUS "Hello from CMakeLists.txt")
message(STATUS "${PROJECT_BINARY_DIR}")
message(STATUS "${ReadConfigValue_VERSION_MAJOR}")
message(STATUS "${ReadConfigValue_VERSION_MINOR}")
CMakeLists.txt を変更した後、プロジェクトのビルド ディレクトリに入り、コマンドを入力すると、cmake .
次の図の情報が表示されます。
3.2 C++ ヘッダー ファイルを生成するための構成を追加する
C++ で CMakeLists.txt の値を読み取りたい場合は、最初にヘッダー ファイルを生成する必要があります。ヘッダー ファイルを生成するには、まずルート ディレクトリに config.h.in ファイルを作成して、生成されたヘッダー ファイル情報を構成する必要があります。作成されたファイルは次のとおりです。次に、CMakeLists.txt ファイルにコードを追加して
、新しく作成された構成ファイルのコードは次のとおりです。
configure_file(config.h.in config.h)
そして、作成した config.h.in で C++ アクセスを許可する値を次のように構成します。
#define ReadConfigValue_VERSION_MAJOR ${
ReadConfigValue_VERSION_MAJOR}
// 可以使用@ 或者${}去获取对应的值
#define ReadConfigValue_VERSION_MINOR @ReadConfigValue_VERSION_MINOR@
3.3 C++ ソースコードの設定値にアクセスする
上記の設定を記述した後、readConfigValue.cpp ファイル内の config.h ヘッダー ファイルを参照します。
#include<iostream>
#include<string>
#include "config.h"
int main(int argc,char* argv[]){
std::cout<<"Hello CMake"<<std::endl;
std::cout<<"Major version=>"<<ReadConfigValue_VERSION_MAJOR<<std::endl;
std::cout<<"Major version=>"<<ReadConfigValue_VERSION_MINOR<<std::endl;
return 0;
}
次に、コンパイル後に config.h ヘッダー ファイルを取得します。
ヘッダー ファイルの内容は、CMakeLists.txt ファイルで構成した値です。
しかし、ビルドすると、エラーが報告されます:
その理由は、config.h ファイルは正常に生成されましたが、C++ ソース ファイルで正しく参照されなかったことです。つまり、インクルード "config.h" がconfig.h へのパスがあるため、このパスを CMakeLists.txt ファイルで構成する必要があります。コードは次のとおりです。
target_include_directories(ReadConfigValue PUBLIC "${PROJECT_BINARY_DIR}")
这里的第一个参数是我们的项目名称,第二个参数可以是PUBLIC、PRIVATE、INTERFACE 目前暂时使用PUBLIC就行,最后一个是我们生成的config.h所在目录的路径,我们的config.h实际上是在build目录下的,我们在前面输出的调试信息中也发现${PROJECT_BINARY_DIR}输出的是build目录的路径,所以配置好它就行了
構成が完了したら、再度コンパイルしてビルドすると、実行でき、CMakeLists.txt ファイルの値を正常に読み取ることができることがわかります。
3.4 C++ ファイルから CMakeLists.txt の文字列を読み取る
CMakeLists.txt ファイル内の文字列を読み取りたい場合は、それも可能です。比較的簡単です。まず、CMakeLists.txt 内の C++ ソース コード ファイル内で読み取りたい文字列を設定します。
#.设置字符串给C++文件读取
set(STR_VALUE "I am String from CMakeLists.txt")
如上图所示,需要注意set()语句的位置,不能放在最后否则这个值无法生成
次に、config.h.in に構成を追加します。
//必须使用双引号,否则在C++源码读取的时候这里没有双引号包裹,会导致读取错误
#define STR_VALUE "@STR_VALUE@"
注意:配置字符串时必须使用双引号包裹我们的取值语句,否则在C++源码读取的时候这里没有双引号包裹,会导致读取错误
次に、C++ ファイルでアクセスします。
#include<iostream>
#include<string>
#include "config.h"
int main(int argc,char* argv[]){
std::cout<<"Hello CMake"<<std::endl;
std::cout<<"Major version=>"<<ReadConfigValue_VERSION_MAJOR<<std::endl;
std::cout<<"Major version=>"<<ReadConfigValue_VERSION_MINOR<<std::endl;
std::cout<<"String value from CMakeLists.txt==>"<<STR_VALUE<<std::endl;
return 0;
}
最後にコンパイルして実行します。
要約する
この記事はシンプルではありますが、実際に開発に役立ちます。たとえば、プログラム内でデバッグ環境とリリース環境を区別したい場合、Android の Gradle プラグインによって生成される BuildCongfig クラスと同じように、CMakeList に設定を追加できます。 、このクラスの DEBUG と RELEASE を便利に使用して、開発環境を正式な環境から区別し、一部の開発環境ログを分離することができます。したがって、友人にこの使用方法に慣れてもらうことをお勧めします。開発に非常に役立ちます。