2016-03-21 12 views
2

Also ich benutze Autoconf, um ein Makefile zu generieren, und ich bin erfolgreich dabei und kompilieren mein Projekt, aber das Problem ist, dass die Objektdateien in src erstellt werden Mappe. Ich möchte, dass sie im Ordner .libs kompiliert werden.Makefile sollte nach .o-Dateien in einem anderen Verzeichnis suchen

Ich kann das auch tun, aber dann ein anderes Problem auftritt, sucht der Compiler für diese .o Dateien im selben Ordner wie die Dateien (die src ist).

Ich habe versucht, alles inklusive:

%.o: $(SDIR)/%.cpp 
     $(CC) $(CFLAGS) -o $(OBJDIR)/[email protected] -c $< 

und

$(OBJDIR)/%.o: %.c 
     $(CC) -c -o [email protected] $< $(CFLAGS) 

und so viele andere Kombinationen, die ich erinnere mich nicht einmal. Aus irgendeinem Grunde, diese Regeln am Ende nicht für die Objektdateien im .libs Ordner suchen, und ich bekomme Fehler während machen laufen:

g++: error: One.o: No such file or directory 
g++: error: Two.o: No such file or directory 
g++: error: Three.o: No such file or directory 
g++: error: Four.o: No such file or directory 

Das ist mein Makefile.am, so weit:

CFLAGS=-Wall -I/chome/siddhs/soft/soft_source_code/target/src/include/ -I/home/siddhs/EclipseProjects/rdma2/include 
AM_LDFLAGS=-L /usr/pbs/new/exec/lib/ -lsoft -lpthread -llmx-altair -L /usr/lib/x86_64-linux-gnu/ -lcrypto -L . -lsoft 

OUT=rdma2.a 
CC=g++ 
OBJDIR=/home/siddhs/EclipseProjects/rdma2/.libs 
SDIR=/home/siddhs/EclipseProjects/rdma2/src 
INC=-Iinc 
ADIR=/usr/local/rdma2/ 

bin_PROGRAMS=rdma2test 

rdma2test_SOURCES = One.cpp Two.cpp Three.cpp Four.cpp 
rdma2test_LDADD=-L /usr/soft/new/exec/lib -lsoft -lpthread -L /usr/lib/x86_64-linux-gnu/ -lcrypto 

_OBJS = One.o Two.o Three.o Four.o 

%.o: $(SDIR)/%.cpp 
     $(CC) $(CFLAGS) -o $(OBJDIR)/[email protected] -c $< 

$(OBJDIR)/%.o: %.c 
     $(CC) -c -o [email protected] $< $(CFLAGS) 
+0

Sie zeigen uns das 'Makefile.am', aber wo ist das Makefile, das es verwendet, das mit der Regel, um etwas aus diesen Objektdateien zu erstellen? – Beta

Antwort

1

Die einfachste Möglichkeit besteht darin, innerhalb des Verzeichnisses .libs ein zweites Makefile.am anzulegen. Die oberste Makefile.am muss nur in der zweiten Makefile.am zeigen. Die zweite beschreibt den gesamten Build-Prozess.

Ein einfaches Beispiel enthält die folgenden.

Makefile.am

SUBDIRS = .libs 

.libs/Makefile.am

bin_PROGRAMS=rdma2test 
noinst_LIBRARIES= librdma2.a 
AM_LDFLAGS=-L. 
librdma2_a_SOURCES = $(SRC)/One.cpp $(SRC)/Two.cpp 
rdma2test_SOURCES = $(SRC)/Main.cpp 
rdma2test_LDADD= -lrdma2 

configure.ac

AC_INIT([rdma2],[1.0]) 
AC_CONFIG_SRCDIR([src/Main.cpp]) 
AM_INIT_AUTOMAKE 
AC_PROG_CXX(g++) 
AC_PROG_RANLIB 
SRC=`pwd`"/src" 
AC_SUBST(SRC) 
AC_OUTPUT([Makefile .libs/Makefile]) 

Hinweis: Mit dieser Konfiguration geben spätere Versionen von automake eine Warnmeldung aus.

Verwandte Themen