我正在使用一个调用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"
时它才能正常工作。当然我不能这样做,因为我每次都需要更改数字。
任何帮助??
答案 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
中,以便它们可以包含在各种不同类型的编译中。