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

drj*_*rm3 5 linker makefile compiler-warnings

我的makefile的一部分看起来像这样......

ifdef vis 
flg += -framework GLUT -framework OpenGL -Dvis
obj += camfun.o glfuns.o
endif
Run Code Online (Sandbox Code Playgroud)

...

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)
Run Code Online (Sandbox Code Playgroud)

在汇编时给我以下警告:

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
Run Code Online (Sandbox Code Playgroud)

现在,我知道我收到了警告,因为我肯定应该(-c选项具体告诉它不要链接)!但我想关掉它,我知道我连接的太多了,我很好.我该怎么关掉那个警告?

Mad*_*ist 6

除非没有传递这些标志,否则无法关闭警告.这并不是说你要链接"太多",它是通过给-c你不链接在所有.如果您将它们发送给不运行链接器的命令,那么应该传递给链接器的任何标志都将显示警告.如果您不想要这些警告,则不要将链接器标志传递给编译器.将makefile中的标志分成两个不同的变量:一个集合同时发送到编译器和链接器(通常是人们使用CFLAGS它,但它只是一个约定)和一个集合,只发送到链接器(通常LDFLAGS).

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

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

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

例如:

ifdef vis 
ccflg += -Dvis
ldflg += -framework GLUT -framework OpenGL
obj += camfun.o glfuns.o
endif
Run Code Online (Sandbox Code Playgroud)

...

all: $(exe)

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

%.o: %.cpp header.h
        $(cc) -c $(ccflg) $<
Run Code Online (Sandbox Code Playgroud)