2012-03-15 5 views
5

częścią mojego makefile wygląda następująco ...jak tłumić „plik linkera nieużywany” podczas kompilowania

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) 

który daje mi następujące ostrzeżenie momencie kompilacji:

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 

teraz, wiem, że jestem coraz to ostrzeżenie, bo zdecydowanie powinien (opcja -c specjalnie go nie mówi do niej link)! ale chcę go wyłączyć, wiem, że łączę zbyt wiele i jestem z tym w porządku. jak wyłączyć to ostrzeżenie?

Odpowiedz

6

Nie można wyłączyć ostrzeżenia, chyba że nie przekazuje się tych flag. To nie jest tak, że łączysz "zbyt wiele", to znaczy, że podając -c nie łączysz w ogóle. Wszystkie flagi, które mają zostać przekazane do linkera, pokażą ostrzeżenie, jeśli dasz im polecenie, które nie uruchamia linkera. Jeśli nie chcesz tych ostrzeżeń, nie przesyłaj flag łącznika do kompilatora. Oddziel flagi w pliku makefile na dwie różne zmienne: jeden zestaw, który przechodzi do kompilatora i linkera (często ludzie używają do tego CFLAGS, ale jest to tylko konwencja) i jeden zestaw, który trafia tylko do łącznika (często LDFLAGS).

Nie powinieneś także łączyć w celu all: mieć oddzielny cel dla pliku wykonywalnego, aby po uruchomieniu zrobić dwa razy z rzędu bez zmian, drugie wywołanie nie będzie działało.

A w POSIX, opcje poleceń powinny zwykle występować przed argumentami nie później.

Oczywiście stosowanie reguł wzoru pomaga uniknąć nadmiarowości.

Na przykład:

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

kiedy dzielę je na '$ (ldflg)' i '$ (ccflg)', otrzymuję garść ostrzeżeń po 'g ++ -c glfuns.cpp -Wno-write-strings -O2 -Dvis' mówiąc, że pewne rzeczy (GLUT_DOUBLE, na przykład) nie zostały zadeklarowane w tym zakresie. kiedy kompiluję tę linię z ldflg i ccflg, to kompiluje, ale dostaję te ostrzeżenia. EDYCJA: miałem zmieszane ccflg i ldflg! dzięki! – drjrm3

+0

Mam podobny problem: z przekazywaniem -Wl, -rpath-link do gcc. Jest to część naszych CFLAGS i wymagałoby to trochę pracy, aby się go pozbyć. Wiem, że to źle, ale liczyłem na szybkie rozwiązanie. Blast modern GCC dla chcących rzeczy, które muszą być poprawne! (to sarkazm BTW) –

0

-c oznacza, że ​​* nie łączysz *. Więc nie przechodź -ramka.

+1

Jestem świadomy, wiem dokładnie, dlaczego tak się dzieje, po prostu chcą tłumić ostrzeżenie. – drjrm3