0

我正在使用一个调用makefile 的shell 来重新编译具有不同#define 选项的同一个项目。

shell 像这样调用生成文件:

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);

我从 shell 和命令行尝试过。那没起效。我也试过“而不是\”。同样的错误。我尝试像这样创建一个新变量:

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

接着 :

-D InputFileName=$Var

也没有用。但是当我#define InputFileName "input/In32.txt"在 main.cpp 中它工作正常。当然我不能这样做,因为我每次都需要更改数字。有什么帮助吗??

4

1 回答 1

6

您可以向我们展示的最有用的东西,您没有提供:make 将打印它调用的编译命令,并且查看它会告诉您确切的问题所在。

在调试 makefile 时,不要使用-s标志来制作!

查看您的makefile,我认为它看起来像这样:

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

问题是您将需要更多引用。您必须从用于运行 make 的 shell 中引用提供给 make 的参数,然后必须再次从 shell 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

关于您的 makefile 的其他一些说明:

  • 您应该CXXFLAGS用于编译 C++ 代码,而不是CFLAGS(用于 C 代码)
  • 你不应该添加-cCFLAGS; 将其放入规则本身。您也应该添加CFLAGS到链接行,这样您就不想-c在那里了。
  • 您不想-lpthread在对象编译行上链接库 ( )。也许你的意思是-pthread这里?
  • 您应该将预处理器标志-I-D编译器标志分开,并将预处理器标志放入其中,CPPFLAGS以便它们可以包含在各种不同类型的编译中。
于 2013-06-07T13:54:57.657 回答