Linker 如何抑制;链接器文件“未使用”;编译时

Linker 如何抑制;链接器文件“未使用”;编译时,linker,makefile,compiler-warnings,Linker,Makefile,Compiler Warnings,我的makefile的一部分如下所示 ifdef vis flg += -framework GLUT -framework OpenGL -Dvis obj += camfun.o glfuns.o endif 这给了我以下的警告: g++ -c camfun.cpp -Wno-write-strings -O2 -framework GLUT -framework OpenGL -Dvis i686-apple-darwin10-g++-4.2.1: -framework: linke

我的makefile的一部分如下所示

ifdef vis 
flg += -framework GLUT -framework OpenGL -Dvis
obj += camfun.o glfuns.o
endif

这给了我以下的警告:

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选项特别告诉它不要链接)!但我想把它关掉,我知道我链接太多了,我同意。如何关闭该警告?

-c
表示您*没有链接*。所以不要传递-framework。

除非不传递这些标志,否则无法关闭警告。这并不是说你链接“太多”,而是通过给-c你根本没有链接。如果您将任何应该传递给链接器的标志传递给不运行链接器的命令,则这些标志将显示警告。如果您不想要这些警告,那么不要将链接器标志传递给编译器。将makefile中的标志分为两个不同的变量:一个是同时指向编译器和链接器的一组(人们通常使用
CFLAGS
,但这只是一种约定),另一个是指向链接器的一组(通常
LDFLAGS

另外,您不应该在
all
target中链接:为可执行文件设置一个单独的目标,这样,如果您连续两次运行make而没有任何更改,第二次调用将不会执行任何操作

在POSIX中,命令选项通常应该在参数之前,而不是之后

当然,使用模式规则有助于避免冗余

例如:

ifdef vis 
ccflg += -Dvis
ldflg += -framework GLUT -framework OpenGL
obj += camfun.o glfuns.o
endif

all:$(exe)
$(exe):driver.cpp header.h$(obj)
$(cc)-o$(exe)$(ccflg)$(ldflg)driver.cpp$(obj)$(lib)
%.o:%.cpp头.h
$(cc)-c$(ccflg)$<

我知道,我确切地知道它发生的原因,我只是想抑制警告。当我将它们分为
$(ldflg)
$(ccflg)
时,在
g++-c glfuns.cpp-Wno write strings-O2-Dvis
之后,我收到一堆警告,说某些东西(例如,GLUT\u DOUBLE)没有在这个范围内声明。当我用ldflg和ccflg编译这行代码时,它会编译,但我得到了这些警告。编辑:我把ccflg和ldflg搞混了!谢谢我有一个类似的问题:将-Wl,-rpath链接传递到gcc。这是我们CFLAG的一部分,需要一些重新工作才能摆脱。我知道这是错误的,但我希望能尽快解决。爆炸现代GCC希望事情是正确的!(顺便说一句,这是讽刺)
ifdef vis 
ccflg += -Dvis
ldflg += -framework GLUT -framework OpenGL
obj += camfun.o glfuns.o
endif
all: $(exe)

$(exe): driver.cpp header.h $(obj) 
        $(cc) -o $(exe) $(ccflg) $(ldflg) driver.cpp $(obj) $(lib)

%.o: %.cpp header.h
        $(cc) -c $(ccflg) $<