2012-03-15 21 views
5

部分看起来是这样的,当...如何抑制“连接文件未使用”编译生成文件我的

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选项专门告诉它不要链接)!但我想关掉它,我知道我连接太多了,而且我确定。我如何关闭该警告?

回答

6

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

另外你不应该在all目标中链接:为可执行文件分别设置一个目标,这样如果你连续运行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 header.h 
     $(cc) -c $(ccflg) $< 
+0

当我将它们分成'$(ldflg)'和'$(ccflg)'时,我在'g ++ -c glfuns.cpp -Wno-write-strings -O2 -Dvis'后面看到一堆警告,例如GLUT_DOUBLE)未在此范围内声明。当我用ldflg和ccflg编译该行时,虽然它编译了但我得到了这些警告。 编辑:我有ccflg和ldflg混合!谢谢! – drjrm3 2012-03-16 13:09:48

+0

我有一个类似的问题:将-Wl,-rpath-link传递给gcc。这是我们CFLAGS的一部分,并且需要一些重新工作才能摆脱。我知道这是错的,但我希望有一个快速解决方案。鼓励现代GCC希望事情是正确的! (这是讽刺) – 2012-09-11 22:07:42

0

-c意味着你*没有链接*。所以不要通过框架。

+1

我知道,我知道为什么它正在发生,我只是想抑制警告。 – drjrm3 2012-03-15 21:42:00

相关问题