带字符串的gcc -D选项中的错误

时间:2013-06-07 13:34:45

标签: gcc g++ makefile

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

shell调用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);

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

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

然后:

-D InputFileName=$Var

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

1 个答案:

答案 0 :(得分:5)

你可能向我们展示的最有用的东西,你没有提供: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 ...

哪个会奏效。但是,如果用户只指定了size值,并且你在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代码)
  • 您不应将-c添加到CFLAGS;把它放入规则本身。您应该在链接行添加CFLAGS,这样就不需要-c
  • 您不希望在对象编译行上链接库(-lpthread)。也许你的意思是-pthread
  • 您应该从编译器标志中分离出-I-D之类的预处理程序标志,并将预处理程序标志放在CPPFLAGS中,以便它们可以包含在各种不同类型的编译中。