如何在编译时禁止“链接器文件未使用”

时间:2012-03-15 21:36:49

标签: linker makefile compiler-warnings

我的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 个答案:

答案 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。