2016-03-21 3 views
2

Donc j'utilise autoconf pour générer un Makefile, et j'ai réussi à le faire et à compiler mon projet, mais le problème est que les fichiers objets sont créés dans le src dossier. Je veux qu'ils soient compilés dans le dossier .libs.Makefile doit chercher les fichiers .o dans un autre répertoire

je suis capable de faire aussi bien, mais un autre problème se pose, les recherches du compilateur pour ces .o fichiers dans le même dossier que les fichiers .cpp (qui est src).

J'ai tout essayé, y compris:

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

et

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

et tant d'autres combinaisons que je ne souviens même pas. Pour une raison quelconque, ces règles ne finissent pas chercher les fichiers d'objet dans le dossier .libs, et je reçois des erreurs lors de l'exécution faire:

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 

Ceci est mon Makefile.am, jusqu'à présent:

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

Vous nous montrer la 'Makefile.am', mais où est le makefile qui l'utilise, celui avec la règle pour la construction en fait quelque chose de ces fichiers objet? – Beta

Répondre

1

la façon la plus simple est de créer une deuxième Makefile.am dans le répertoire .libs. Le haut Makefile.am aura besoin que le point dans la deuxième Makefile.am. La seconde décrira tout le processus de construction.

Un exemple simple contiendra les suivantes.

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]) 

Note: Avec cette configuration les versions ultérieures de problème automake un message d'avertissement.