1

次の SCons 構成があります。

current_directory
|-<.cpp files>
|-<.h files>
|-SConstruct
|-SConscript
|-bin
  |-<empty>

binソース ファイルをビルドし、実行可能ファイルとオブジェクト ファイルをディレクトリに配置したいと考えています。

これは私のSConstructファイルにあるものです:

SConscript('SConscript', variant_dir='bin', duplicate=0)

私が持っているSConsriptファイルにいる間:

debug_environment.Program(target = 'SsaTest', src_files, LIBS=libraries, LIBPATH=libraries_path)

sconsコマンドを使用してビルドすると、(必要に応じSsaTestて) ディレクトリに実行可能binファイルが作成されますが、オブジェクト ファイルは現在のディレクトリに残ります。

.oファイルをbinディレクトリにも構築するにはどうすればよいですか?

どうもありがとう。

編集: 完全なSConscriptファイル(s を許してくださいxxx)

import os

# This is correctly Exported()
Import('debug_flags')

# Paths to header files
headers_paths = ['#/../../xxx/include/',
                 '#/../../../xxx/include/',
                 '#/../../xxx/include/',
                 '#/../../xxx/include/',
                 '#/../../xxx/include/']

# Path to source files
src_folder = '#./'

# Source files list
src_files = ['xxx.cpp',
             'xxx.cpp',
             'xxx.cpp',
             'xxx.cpp',
             'xxx.cpp']

# Prepend the relative path to each source file name
src_files = [src_folder + filename for filename in src_files]

libraries = ['xxx', 'xxx', 'xxx', 'xxx', 'xxx', 'xxx', 'xxx', 'xxx']

libraries_path = ['#/../../xxx/lib',
                  '#/../../../xxx/bin', 
                  '#/../lib', 
                  '#/../../xxx/lib', 
                  '#/../../xxx/lib', 
                  '#/../../xxx/lib']

# Debug environment
debug_environment = Environment(CC = 'g++', CCFLAGS=debug_flags, ENV = os.environ, CPPPATH=headers_paths); 
# Executable build command
debug_environment.Program(target = 'SsaTest', src_files, LIBS=libraries, LIBPATH=libraries_path)
4

2 に答える 2

2

ソースファイルで「#」を使用することはお勧めしません。状況があるため、scons はバリアントディレクトリでそれを正しく処理できず、その結果、ソースが配置されたディレクトリにオブジェクトファイルを作成する方法があります。

だから、私はあなたの例を同じ構成で構築しようとしましたが、問題はありません:

#SConsctruct
SConscript('SConscript', variant_dir='bin', duplicate=0)

#SConscript
src_files = Glob('*.cpp')
debug_environment = Environment()
debug_environment.Program('SsaTest', src_files)

したがって、すべてのオブジェクト ファイルは bin ディレクトリに生成されます。

最後に、ソース ファイルとの関係ディレクトリとバリアント ディレクトリの使用に問題はありません。ただし、インクルードディレクトリはバリアントディレクトリに依存しています。構成例:

build
app
--SConscript
--src
----*.h
----*.cpp
SConstruct

#SConstruct
rootEnv = Environment()
Export('rootEnv')
SConscript('app/SConscript', variant_dir='build', duplicate=0)

SConscript は次のようになります。

Import('rootEnv')
env = rootEnv.Clone()
env.Append(CPPPATH = ['#app/src'])
env.Program('app', Glob('src/*.cpp'))

'#app/src' - バリアント ディレクトリを使用する場合、# は非常に重要です。これは、app/src の場合、ビルド コマンドが次のようになるためです: '-Ibuild/app/src' (インクルード パスの前にバリアント ディレクトリを追加します)。ただし、「#」コマンドを追加すると、「-Iapp/src」が正しく表示されます。

于 2012-05-24T10:25:21.330 に答える
1

SConscript で際立っていることの 1 つは、各ソース ファイルへのパスの先頭に#./.

# Path to source files
src_folder = '#./'

そのパスでドットを使用するのはなぜですか。必要ではないのですか? #/次のように、残りのパスで行うのと同じように、次のことを試してください。

# Path to source files
src_folder = '#/'

もう 1 つのオプションは、ソース ファイルとそれぞれの SConscript を独自のサブディレクトリに配置することです。SConstruct、SConscript、およびソース ファイルがすべて 1 つのディレクトリにある理由は明確ではありません。サブディレクトリを作成するか、必要でない場合は SConscript を削除することを検討してください。

SConstruct の SConscript() 関数呼び出しで、variant_dir を「bin」ではなく「#bin」として参照します。これが役立つかどうかはわかりませんが、より良い方法です。

ここで説明したように、Repository() SCons 関数を使用してソース ファイルを参照する前に、この動作を確認しました

また、これはトピック外ですが、インクルード パスとライブラリ パス (headers_paths および libraries_path 変数) がプロジェクト ディレクトリ構造の外にある場合は、代わりに絶対パスを使用することを検討してください。個人的には、複数のパスで相対パスを使用するのはかなり見苦しいと思います../

于 2012-05-24T09:17:05.517 に答える