цель - скомпилять статическую либу. шарился по гуглу - нашел нужный пример makefile ( главное работающий )
решил его усовершенствовать, внедрив переменную VPATH в которой перечислилбы все пути по которым cpp и h лежат
но не фурычитструктура каталогов такая:
/home/project/include/pgLog.h
/home/project/lib
/home/project/pgLog/src/pgLog.cpp
/home/project/pgLog/makefile
objects = pgLog.o
all:
VPATH := ./home/project/pgLog/src
# VPATH = ./home/project/pgLog/src так пробовал
# VPATH = /home/project/pgLog/src и так пробовал
# VPATH = src и так пробовал
gcc -fpic -c pgLog.cpp
ar -cr ../lib/pgLog.a pgLog.o.PHONY : clean
clean :
rm ../lib/pgLog.a $(objects)выдает следущее:
# make
VPATH := ./usr/
VPATH: not found
*** Error code 127собственно подскажите где собако порылась. читал маны по GNU MAKE но нифига не понял :-(
пишу под FreeBSD.PS и подскажите плиззз как в makefile задать директорию include чтобы в cpp цеплялось при компиляции правильно: #include <pgLog.h>
[...]
>собственно подскажите где собако порылась. читал маны по GNU MAKE но нифига
>не понял :-(
>пишу под FreeBSD.Возможно в этом и проблема -- стандартный make из FreeBSD не понимает многих GNU-специфичных фич. Возможно, что VPATH есть только в GNU версии make. Попробуйте вместо make запускать gmake (возможно, его придётся поставить из портов предварительно).
>PS и подскажите плиззз как в makefile задать директорию include чтобы в cpp цеплялось при компиляции правильно: #include <pgLog.h>
Вызывать компилятор с ключиком -I/path/to/directory/with/header
>[оверквотинг удален]
>>пишу под FreeBSD.
>
>Возможно в этом и проблема -- стандартный make из FreeBSD не понимает
>многих GNU-специфичных фич. Возможно, что VPATH есть только в GNU версии
>make. Попробуйте вместо make запускать gmake (возможно, его придётся поставить из
>портов предварительно).
>
>>PS и подскажите плиззз как в makefile задать директорию include чтобы в cpp цеплялось при компиляции правильно: #include <pgLog.h>
>
>Вызывать компилятор с ключиком -I/path/to/directory/with/headerпервую проблему решил. вторая, с путями к хедерам нет :-(
CC=gcc
libname = pgLog.a
objects = pgLog.o
source_dirs = srclibpath = ../lib
INCLUDES=../includesearch_wildcards := $(addsuffix /*.cpp,$(source_dirs))
# Linking object files
all: $(objects)
ar -cr $(libpath)/$(libname) $(objects)
echo pgLog: make completeVPATH = $(source_dirs)
# Compiling source files
%.o: %.cpp
gcc -fpic -c -L$(libpath) -I$(INCLUDES) $(addprefix -I,$(source_dirs)) $<# Removing the executable and the object files
clean:
rm $(libpath)/$(libname) $(objects)
echo clean: make completePS я не разобрался что делает строка $(addprefix -I,$(source_dirs)), но поскольку она была в примере тут, то я ее решил оставить.
хотя что с ней что без нее не компиляется - ругается на
#include <pgLog.h> пробовал менять на #include "pgLog.h" один фиг - не видит.
читал ману по ключику -I в gcc вроде все правильно, но что то не правильно :-(
>#include <pgLog.h> пробовал менять на #include "pgLog.h" один фиг - не видит.
>читал ману по ключику -I в gcc вроде все правильно, но что
>то не правильно :-(Оставьте <pfLog.h>
Покажите вывод (g)make при запуске, с командами компиляции и ошибкой.
>>#include <pgLog.h> пробовал менять на #include "pgLog.h" один фиг - не видит.
>>читал ману по ключику -I в gcc вроде все правильно, но что
>>то не правильно :-(
>
>Оставьте <pfLog.h>
>Покажите вывод (g)make при запуске, с командами компиляции и ошибкой.
$ make all
c++ -O2 -fno-strict-aliasing -pipe -c src/pgLog.cpp
src/pgLog.cpp:1:19: pgLog.h: No such file or directory
src/pgLog.cpp:13: error: `pgLog' has not been declared
>
>$ make all
>c++ -O2 -fno-strict-aliasing -pipe -c src/pgLog.cpp
>src/pgLog.cpp:1:19: pgLog.h: No such file or directory
>src/pgLog.cpp:13: error: `pgLog' has not been declared
>Нужно добиться, чтобы команда выглядела как:
c++ -O2 -fno-strict-aliasing -pipe -c src/pgLog.cpp -I../include
Предлагаю действовать следующим образом:
- закомментировать
%.o: %.cpp
gcc -fpic -c -L$(libpath) -I$(INCLUDES) $(addprefix -I,$(source_dirs)) $<- найти правило по которому из cpp-файлов получаются объектники и посмотреть какие переменные там используются. После чего просто выставить нужную вам переменную.
Например. у меня:
make -p:
.cpp.o:
$(COMPILE.cpp) $(OUTPUT_OPTION) $<Далее смотрим во что раскрыаются переменные $(COMPILE.cpp) и $(OUTPUT_OPTION):
OUTPUT_OPTION = -o $@
COMPILE.cpp = $(COMPILE.cc)Смотрим что есть $(COMPILE.cc):
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
Т.е. Можно просто попробовать выставить CXXFLAGS или CPPFLAGS в нужное значение
>[оверквотинг удален]
>Далее смотрим во что раскрыаются переменные $(COMPILE.cpp) и $(OUTPUT_OPTION):
>
>OUTPUT_OPTION = -o $@
>COMPILE.cpp = $(COMPILE.cc)
>
>Смотрим что есть $(COMPILE.cc):
>
>COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
>
>Т.е. Можно просто попробовать выставить CXXFLAGS или CPPFLAGS в нужное значениевот так работает:
libname = pgLog.a
objects = pgLog.o
source_dirs = src#const
CC=gcc
LIBDIR = ../lib
INCLUDESDIR=-I../include -Isrcsearch_wildcards := $(addsuffix /*.cpp,$(source_dirs))
# Linking object files
all: $(objects)
ar -cr $(libpath)/$(libname) $(objects)#VPATH = $(source_dirs)
pgLog.o: src/pgLog.cpp
gcc -fpic -c $(INCLUDESDIR) src/pgLog.cpp# Removing the executable and the object files
clean:
rm $(libpath)/$(libname) $(objects)
echo clean: make complete
закоментарил #VPATH = $(source_dirs) ибо с этой директивой непонятно почему компилялось с такимим параметрами:
c++ -O2 -fno-strict-aliasing -pipe -c src/pgLog.cppи игнорировались все заданные мной.
теперь встает вопрос: как скрестить ужа и ежа. чтобы автоматический поиск шел и компиляция всех cpp файлов во всех указанных директориях. ибо очень не хочется строчки вбивать для каждого файла:
имя1.o: src/имя1.cpp
gcc -fpic -c $(INCLUDESDIR) src/имя1.cppимя2.o: src_bin/имя2.cpp
gcc -fpic -c $(INCLUDESDIR) src_bin/имя2.cppимя3.o: src_crc/имя3.cpp
gcc -fpic -c $(INCLUDESDIR) src_crc/имя3.cpp