SconsはPythonで記述されたコンパイルスクリプトに依存しているため、makefileと比較して使いやすく、makefile構文を覚える必要がありません。
インストール方法:
1 python3をインストールし、
2 sudo python -m pip install sconsを実行します。
MakefileがMakefileを必要とするのと同様に、SconsもSconstructファイルを必要とします。コンパイルスクリプトの記述に使用され、構文はpythonと同じです。Sconsが正しくインストールされていることを確認するには、何も書き込まずに新しいSconstructファイルを作成します。Sconstructと同じディレクトリに移動します。ターミナルを開いてsconsを実行します
Sconsが正常にインストールされたことを示す次の印刷が表示されます。
scons:SConscriptファイルを読み込んでいます...
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
scons: `。 ' 最新です。
scons:ターゲットの構築が完了しました。
テストファイルを書き込むには、test.c
int
メイン()
{
printf( "Hello、world!\ n");
1を返します。
}
このようなファイルをコンパイルするには、Sconstructでプログラム( 'test.c')のステートメントが1つだけ必要です。
sconsコマンドを実行します。次の出力が表示されます。実際、実行プロセスはMakefileと同じです。しかし、構文は比較的単純です
scons:SConscriptファイルを読み込んでいます...
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
gcc -o test.o -c test.c
gcc -o test test.o
scons:ターゲットの構築が完了しました。
scons -cを実行してすべてのターゲットファイルをクリーンアップします。この効果は、クリーンにすることと同じです。
scons:SConscriptファイルを読み込んでいます...
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットのクリーニング...
test.oを削除
削除されたテスト
scons:ターゲットのクリーニングが完了しました。
.oファイルのみを作成したい場合は、コマンドObject( 'test.c')を使用できます。
scons:SConscriptファイルを読み込んでいます...
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
gcc -o test.o -c test.c
scons:ターゲットの構築が完了しました。
SConstructの構文はpython形式ですが。ただし、実行の順序はコード内の呼び出しの順序とは異なります。たとえば、次のSConstructファイル
print( "Generate test.c")
プログラム( 'test.c')
print( "Generate test1.c")
プログラム( 'test1.c')
実行結果は次のとおりです。出力内のステートメントが最初に出力され、次にビルドステップが実行されていることがわかります。
scons:SConscriptファイルを読み込んでいます...
test.cを生成する
test1.cを生成する
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
gcc -o test.o -c test.c
gcc -o test test.o
gcc -o test1.o -c test1.c
gcc -o test1 test1.o
scons:ターゲットの構築が完了しました。
リンクライブラリ:
コード開発では、他のチームまたは既存のモジュールの関数がインポートされることがよくあります。これには、他のオブジェクトファイルへのリンクが必要です。
srcファイルにfunc.oファイルがあります。Funcのコードは次のとおりです。
#include <stdio.h>
void print_in()
{
printf( "print_info \ n");
}
print_in関数はmain.cで参照されます
#include <stdio.h>
void main()
{
print_in();
printf( "hello world \ n");
}
Sconstructスクリプトは次のとおりです
SCons.Scriptインポートから*
scons.SConsからのインポート*
env = Environment()
env.Append(LIBPATH = ['./ src'])// LIBPATHを設定し、sconsにライブラリを検索するパスを指示します
env.Program( 'scon_test.c'、LIBS = ['func'])//インポートするLIBSを設定する場合、sconsにどのライブラリを見つけるかを指示します
実行スクリプトは以下の通りです。-Lと-lの設定はgccで設定されます
scons:SConscriptファイルを読み込んでいます...
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
gcc -o scon_test.o -c scon_test.c
scon_test.c:関数 'main':
scon_test.c:7:5:警告:関数 'print_in'の暗黙の宣言; 「printf」の意味ですか?[-Wimplicit-function-declaration]
print_in();
^ ~~~~~~~
printf
gcc -o scon_test scon_test.o -Lsrc -lfunc
scons:ターゲットの構築が完了しました。
同様に、.hヘッダーファイルを別のパスで見つける場合は、CPPATHパラメーターも設定できます。
Var.hはMain.cに含まれています
#include <stdio.h>
#include "var.h"
void main()
{
printf( "var =%d \ n"、para);
printf( "hello world \ n");
}
var.hはincパスの下にあります
#ifndef __var_h__
#3の定義
#define __var_h__
#endif
Sconstructファイル。CPPPATHを設定することにより、ヘッダーファイルの場所をsconsに指示できます
SCons.Scriptインポートから*
scons.SConsからのインポート*
env = Environment()
print( "cc =%s"%env ['CC'])
env.Program( 'scon_test.c'、CPPPATH = ['./ inc'])
実行結果は次のとおりです。-Iを追加すると構成を確認できます
scons:SConscriptファイルを読み込んでいます...
cc = gcc
scons:SConscriptファイルの読み取りが完了しました。
scons:ターゲットの構築...
gcc -o scon_test.o -c -Iinc scon_test.c
gcc -o scon_test scon_test.o
scons:ターゲットの構築が完了しました。