2016-03-21 21 views
2

Bir Makefile oluşturmak için autoconf kullanıyorum ve bunu yaparken ve projemi derlemede başarılı oldum, ancak sorun nesne dosyalarının src içinde oluşturulduğu Klasör. Bunların .libs klasöründe derlenmesini istiyorum.Makefile .o dosyalarını başka bir dizinde aramalı

bunun da yapabilir, ama sonra başka sorun (src olan), .cpp dosyaları aynı klasöre bu .o dosyalar için derleyici aramalar doğar. dahil

denedim her şey:

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

ve

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

ve hatta hatırlamıyorum pek çok başka kombinasyonlar

. Şimdiye kadar,

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 

Bu benim Makefile.am geçerli:: yapmak çalışırken Nedense , bu kurallar .libs klasörde nesne dosyaları için görsterme yoktur ve ben hataları olsun

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

Bize "Makefile.am" 'ı gösterirsiniz, ama bunu kullanan makefile nerede, aslında bu nesne dosyalarından bir şeyler oluşturma kuralı olan? – Beta

cevap

1

En basit yol, .libs dizininin içinde ikinci bir Makefile.am oluşturmaktır. En üstteki Makefile.am, yalnızca ikinci Makefile.am numaralı noktayı işaret etmelidir. İkincisi, tüm yapım sürecini açıklayacaktır.

Basit bir örnek, aşağıdakileri içerecektir.

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

Not: Bu yapılandırmada, automake'un sonraki sürümlerinde bir uyarı iletisi verilir.