The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"makefile, не понимает VPATH почемуто"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"makefile, не понимает VPATH почемуто"  
Сообщение от progman_rus (ok) on 10-Окт-08, 09:49 
цель - скомпилять статическую либу. шарился по гуглу - нашел нужный пример 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>

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "makefile, не понимает VPATH почемуто"  
Сообщение от phpcoder email(??) on 10-Окт-08, 12:13 
[...]
>собственно подскажите где собако порылась. читал маны по GNU MAKE но нифига
>не понял :-(
>пишу под FreeBSD.

Возможно в этом и проблема -- стандартный make из FreeBSD не понимает многих GNU-специфичных фич. Возможно, что VPATH есть только в GNU версии make. Попробуйте вместо make запускать gmake (возможно, его придётся поставить из портов предварительно).

>PS и подскажите плиззз как в makefile задать директорию include чтобы в cpp цеплялось при компиляции правильно: #include <pgLog.h>

Вызывать компилятор с ключиком -I/path/to/directory/with/header

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "makefile, не понимает VPATH почемуто"  
Сообщение от progman_rus (ok) on 10-Окт-08, 12:41 
>[оверквотинг удален]
>>пишу под 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 = src

libpath = ../lib
INCLUDES=../include

search_wildcards := $(addsuffix /*.cpp,$(source_dirs))

# Linking object files
all: $(objects)
    ar -cr $(libpath)/$(libname) $(objects)
    echo pgLog: make complete

VPATH = $(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 complete

PS я не разобрался что делает строка $(addprefix -I,$(source_dirs)), но поскольку она была в примере тут, то я ее решил оставить.
хотя что с ней что без нее не компиляется - ругается на
#include <pgLog.h> пробовал менять на #include "pgLog.h" один фиг - не видит.
читал ману по ключику -I в gcc вроде все правильно, но что то не правильно :-(

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "makefile, не понимает VPATH почемуто"  
Сообщение от phpcoder email(??) on 10-Окт-08, 12:47 
>#include <pgLog.h> пробовал менять на #include "pgLog.h" один фиг - не видит.
>читал ману по ключику -I в gcc вроде все правильно, но что
>то не правильно :-(

Оставьте <pfLog.h>
Покажите вывод (g)make при запуске, с командами компиляции и ошибкой.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "makefile, не понимает VPATH почемуто"  
Сообщение от progman_rus (ok) on 10-Окт-08, 12:53 
>>#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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "makefile, не понимает VPATH почемуто"  
Сообщение от phpcoder email(??) on 10-Окт-08, 13:04 
>
 
>$ 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 в нужное значение

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "makefile, не понимает VPATH почемуто"  
Сообщение от progman_rus (ok) on 10-Окт-08, 18:53 
>[оверквотинг удален]
>Далее смотрим во что раскрыаются переменные $(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 -Isrc

search_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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру