• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

C++ Makefile Anfängerfrage

toor

Bruchpilot
Themenstarter #1
Hallo Leute,

Ich habe mir Eclipse + CDT aufgesetzt als IDE für meine C++ Versuche.

In meinem Testprojekt verwende ich die freie CORBA Implementierung mico.

Dies erfordert ua. das Einbinden der Datei CORBA.h im Verzeichnis /usr/local/include

Dieses Verzeichnis habe ich beim Projekt als include-Pfad angegeben.
Da ich allerdings nicht weiß wie Eclipse diesen Pfad einbinden will (muss ich das über eine Variable beim build aufruf machen?)
hab ich den Pfad in mein Makefile eingetragen:

Code:
# 

VERSION = 0.01
CC      = /usr/bin/g++
#CFLAGS  = -Wall -g -D_REENTRANT -DVERSION=\"$(VERSION)\"
CFLAGS  = -DVERSION=\"$(VERSION)\"
LDFLAGS = 
TARGET  = hico
OBJECTS = main.o
INCL    = /usr/local/include/



#Make all
all: ${OBJECTS}
		${CC} ${CFLAGS} ${OBJECTS} $(INCL) -o ${TARGET} ${LDFLAGS}


               
clean:
		-rm *.o *~ core
Mittels Mico kann man sich nun C++ Sourcefiles erstellen lassen.
Code:
 *  MICO --- an Open Source CORBA implementation
 *  Copyright (c) 1997-2006 by The Mico Team
 *
 *  This file was automatically generated. DO NOT EDIT!
 */

#include  <CORBA.h>
#include <mico/throw.h>
Nur meckert make rum, dass die Datei CORBA.h nicht gefunden werden kann. Irgendwie scheint hier nicht wirklich in /usr/local/include nachgesehen werden.

Zum Testen hab ich mal den include-Pfad absolut angegeben, und so einen Fehler weniger erhalten.
Ich sitz hier etwas auf der Leitung ...

wenn CORBA interessiert, hier das Tutorial, nach dem ich größtenteils vorgegangen bin : http://cplus.kompf.de/corbatut.html

Da ich leider noch nicht viel Erfahrung mit makefiles und Eclipse/CDT als IDE habe, wär ich froh, wenn mir jemand nen Tipp geben könnte, was ich hier verbockt habe :o
 

-Daemon-

Well-Known Member
#2
Zu deinem Compilierproblem: Setz deine zusätzlich benötigten Bibliotheken mal in die LDFLAGS. So ein Compileraufruf sieht dann beispielsweise so aus:
Code:
CC -L/pfad/zur/lib programm.cpp -o programm
HTH
 

döna

Well-Known Member
#3
Servus,
ohne jede gewähr würde ich mal folgendes im Makefile probieren:
Code:
LDFLAGS = -lmico2.3.11
und in der CC Zeile mal ein "-I" vor "$(INCL)", damit sagst du GCC, dass das
nachfolgende ein weiteres Include-Verzeichnis ist, in dem er nachschauen soll.

HTH,
Döna
 

Tronar

aus Überzeugung altmodisch
#4
Das Problem, daß in FreeBSD normalerweise die /usr/local-Verzeichnisse nicht beachtet werden, habe ich durch zwei Umgebungsvariablen ganz pauschal in meinem Environment gelöst, unabhängig von einzelnen Makefiles und Programmen:

setenv CPATH /usr/local/include

Aus "man gcc":

CPATH specifies a list of directories to be searched as if speci-
fied with -I, but after any paths given with -I options on the com-
mand line. This environment variable is used regardless of which
language is being preprocessed.

setenv LIBRARY_PATH /usr/local/lib

The value of LIBRARY_PATH is a colon-separated list of directories,
much like PATH. When configured as a native compiler, GCC tries
the directories thus specified when searching for special linker
files, if it can't find them using GCC_EXEC_PREFIX. Linking using
GCC also uses these directories when searching for ordinary
libraries for the -l option (but directories specified with -L come
first).

Das erspart einigen Ärger. Man muß nur aufpassen, wenn man selbst Makefiles zum Weitergeben verfaßt, also zum Testen mit "unsetenv" den Urzustand wiederherstellen.

Hth,
Tronar
 

FierceOne

Kampfmaschine
#5
Wenn gcc ein include-Verzeichnis mit berücksichtigen soll dann geht das mit Switch -I <dir>. Dieses Switch kann ich nirgends entdecken. D.h. entweder Du schreibst INCL = -I /usr/local/include oder $(CC) bla bla -I $(INCL) blub blub

EDIT:
Ich sehe gerade dass das döna schon geschrieben hat.
 

toor

Bruchpilot
Themenstarter #6
danke für eure Hilfe, aber ich glaube ich hab einfach beim buildtarget definieren versagt :)

Das Makefile sieht jetzt so aus:

Nach Target: müssen ja alle Files angegeben werden, von dem Target abhängt, und dass hab ich oben schlicht nicht eingebaut.
Zusätzlich hab ich noch eure Vorschläge eingebaut für das include und lib Verzeichnis.

Code:
VERSION = 0.01
CC      = /usr/bin/g++
#CFLAGS  = -Wall -g -D_REENTRANT -DVERSION=\"$(VERSION)\"
CFLAGS  = -DVERSION=\"$(VERSION)\"
LDFLAGS = -lmico2.3.12 -lcrypto -lssl -lpthread
TARGET  = hico
OBJECTS = main.cpp
INCL    = -I /usr/local/include
LIBS    = -L /usr/local/lib


#Make all
all:  %.cpp %.h
		${CC} ${CFLAGS}   ${OBJECTS}  $(INCL) -o ${TARGET}  ${LDFLAGS}  ${LIBS}