我的makefile的一部分看起来像这样......
ifdef vis
flg += -framework GLUT -framework OpenGL -Dvis
obj += camfun.o glfuns.o
endif
...
all: driver.cpp header.h $(obj)
$(cc) -o $(exe) driver.cpp $(obj) $(flg) $(lib)
funs.o: header.h funs.cpp
$(cc) -c funs.cpp $(flg)
glfuns.o: header.h glfuns.cpp
$(cc) -c glfuns.cpp $(flg)
camfun.o: header.h camfun.cpp
$(cc) -c camfun.cpp $(flg)
在编译时给出了以下警告:
g++ -c camfun.cpp -Wno-write-strings -O2 -framework GLUT -framework OpenGL -Dvis
i686-apple-darwin10-g++-4.2.1: -framework: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: GLUT: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -framework: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: OpenGL: linker input file unused because linking not done
现在,我知道我收到了警告,因为我肯定应该(-c选项明确告诉它不要链接)!但我想关掉它,我知道我连接的太多了,我很好。我如何关闭该警告?
答案 0 :(得分:6)
除非没有传递这些标志,否则无法关闭警告。这并不是说你“链接太多”了,而是通过给予-c你根本没有链接 。如果您将它们发送给不运行链接器的命令,那么应该传递给链接器的任何标志都将显示警告。如果您不想要这些警告,则不要将链接器标志传递给编译器。将makefile中的标志分成两个不同的变量:一个集合同时发送到编译器和链接器(通常人们使用CFLAGS
但这只是一个约定)和一个集合只是链接器(通常{ {1}})。
此外,您不应该在LDFLAGS
目标中链接:为可执行文件设置单独的目标,这样如果您连续两次运行make而不进行更改,则第二次调用将不执行任何操作。
在POSIX中,命令选项通常应该在参数之前而不是之后。
当然,使用模式规则有助于避免冗余。
例如:
all
...
ifdef vis
ccflg += -Dvis
ldflg += -framework GLUT -framework OpenGL
obj += camfun.o glfuns.o
endif
答案 1 :(得分:0)
-c
表示您*没有链接*。所以不要通过-framework。