как подавить "файл компоновщика не используется" при компиляции - PullRequest
5 голосов
/ 16 марта 2012

часть моего make-файла выглядит так ...

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 голосов
/ 16 марта 2012

Вы не можете отключить предупреждение, если не пропустите эти флаги. Дело не в том, что вы связываете «слишком много», а в том, что, давая -c, вы не связываете вообще . Любые флаги, которые должны быть переданы компоновщику, будут отображать предупреждение, если вы передадите их команде, которая не запускает компоновщик. Если вы не хотите получать эти предупреждения, не передавайте флаги компоновщика вашему компилятору. Разделите ваши флаги в вашем make-файле на две разные переменные: один набор, который идет и компилятору, и компоновщику (часто люди используют 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 голосов
/ 16 марта 2012

-c означает, что вы * не связываете *.Так что не сдавай -рамку.

...