0

メイクファイルを呼び出すシェルを使用して、同じプロジェクトを異なる #define オプションで再コンパイルしています。

シェルは次のように makefile を呼び出します。

make UserDefined="-D SomeDefines -D InputFileName=\"input/In$SIZE.txt\"" -s

ここで、$SIZE は、たとえば 32 に等しい数値変数です。これは、プロジェクトのすべてのファイルに対して正常にコンパイルされますが、main.cpp ではなく、main.cpp のコマンドは次のとおりです。

g++ $(CFLAGS) $(Main) \
    -I$(CUDA_HOME)/include \
    -lpthread -o main.o

$(Main) は入力ファイルへのパスです $(CUDA_HOME) は cuda ライブラリへのパスで、$(CFLAGS) は次のとおりです: CFLAGS = -c -Wall $(UserDefined) -std=c++0x

このコマンドを実行すると、次のエラーが発生します。

../src/main.cpp: In function ‘int main()’:
../src/main.cpp:11:30: error: ‘input’ was not declared in this scope
../src/main.cpp:11:30: error: ‘In32’ was not declared in this scope

main.cpp ファイルの 11 行目:

InputSignalFile.open(InputFileName);

シェルとコマンドラインから試しました。それは動かなかった。「\」の代わりに「」も試しました。同じエラー。次のような新しい変数を作成してみました。

Var=\"input/In$SIZE.txt\"

その後 :

-D InputFileName=$Var

も機能しませんでした。しかし#define InputFileName "input/In32.txt"、main.cpp では問題なく動作します。もちろん、毎回番号を変更する必要があるため、これを行うことはできません。何か助けて??

4

1 に答える 1

6

あなたが私たちに示すことができた最も有用なことは、あなたが提供しなかったことです.makeは、それが呼び出すコンパイルコマンドを出力し、それを見ると、何が間違っているかを正確に教えてくれます.

-smakefile をデバッグしているときは、make にフラグを使用しないでください!!

メイクファイルを見ると、次のようになっていると思います。

g++ -c -Wall -D SomeDefines -D InputFileName="input/In$SIZE.txt" -I ...

問題は、さらに多くの引用が必要になることです。make を実行するために使用しているシェルから make に与えられた引数を引用する必要があります。コンパイラは二重引用符を見たいので、make を実行するシェルから引数を再度引用する必要があります。

次のようなものを実行する必要があります。

make UserDefined="-D SomeDefines -D InputFileName='\"input/In$SIZE.txt\"'" -s

これにより、コンパイル行は次のようになります。

g++ -c -Wall -D SomeDefines -D InputFileName='"input/In$SIZE.txt"' -I ...

これは機能します。ただし、ユーザーがサイズ値のみを指定し、makefile 内でそれを作成した場合は、はるかに簡単になります。

make SIZE=$SIZE UserDefined="-D SomeDefines"

CFLAGS = -c -Wall $(UserDefined) -D InputFileName='"input/In$(SIZE).txt"' -std=c++0x

メイクファイルに関するその他の注意事項:

  • (Cコード用ではありCXXFLAGSません)C++コードのコンパイルに使用する必要がありますCFLAGS
  • -cに追加しないでくださいCFLAGS。それをルール自体に入れます。リンク行にも追加する必要があるCFLAGSので、そこに入れたく-cありません。
  • -lpthreadオブジェクト コンパイル行でライブラリ ( ) をリンクしたくありません。多分あなたは-pthreadここを意味しましたか?
  • -Iや などのプリプロセッサ フラグをコンパイラ フラグから分離し、さまざまな種類のコンパイルに含めることができるように-Dプリプロセッサ フラグを配置する必要があります。CPPFLAGS
于 2013-06-07T13:54:57.657 に答える