如何在编译时抑制“链接器文件未使用”的警告?

5
我的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选项明确告诉它不要链接)!但我想关闭它,我知道我链接太多,我可以接受。如何关闭该警告?

2个回答

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) $<

当我将它们分成$(ldflg)$(ccflg)时,在g++ -c glfuns.cpp -Wno-write-strings -O2 -Dvis之后,我会得到一堆警告,说某些东西(例如GLUT_DOUBLE)在此范围内未声明。然而,当我使用ldflg和ccflg编译该行时,它可以编译,但我仍然会收到这些警告。编辑:我把ccflg和ldflg搞混了!谢谢! - drjrm3
我有一个类似的问题:使用-Wl,-rpath-link传递给gcc。这是我们CFLAGS的一部分,需要花费一些时间来摆脱它。我知道这是错误的,但我希望能找到一个快速的解决方案。现代GCC要求一切都正确,真是太讨厌了!(顺便说一句,这是讽刺) - David Dombrowsky

0

-c 表示你不链接 *. 因此不要传递 -framework 参数。


1
我知道,我清楚地知道为什么会发生这种情况,我只是想抑制警告。 - drjrm3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接