我得到了下面的 makefile,它在 linux 和 mac os 下工作得很好。然而,它在 FreeBSD
上无法执行任何操作,我不知道为什么。它给出以下输出:
19:31:35 user@host:~/libhttp++/src> make
-
Making HTTP++ library..
make[1]: don't know how to make obj/libhttp++.a. Stop
make[1]: stopped in /usr/home/user/libhttp++/src/obj
*** Error code 2
Stop.
make: stopped in /usr/home/user/libhttp++/src
我还尝试了 gmake
,它给出了以下输出:
19:31:35 user@host:~/libhttp++/src> gmake
-
Making HTTP++ library..
Building Lib ...
ar -rs obj/libhttp++.a obj/html.o obj/http.o obj/object.o
ar: warning: creating obj/libhttp++.a
ar: warning: can't open file: obj/html.o: No such file or directory
ar: warning: can't open file: obj/http.o: No such file or directory
ar: warning: can't open file: obj/object.o: No such file or directory
ar: fatal: Failed to open 'obj/libhttp++.a'
*** Error code 70
Stop.
make[1]: stopped in /usr/home/user/libhttp++/src
gmake: *** [all] Error 1
一个问题可能是我试图将所有中间目标文件以及 lib 本身保存在单独的子目录(“obj”)中。
问题是,我不太了解 makefile,freebsd 手册以及我可以通过 google 找到的任何示例 makefile 都没有太大帮助。 makefile 基本上是从我在某处找到的工作 linux makefile 复制的,而且它适用于 linux 和 mac os。有没有办法将其转换为适用于所有 3 个平台的格式?任何帮助将非常感激。
生成文件:
#--------------------------------------------------------------------------
# defines
#--------------------------------------------------------------------------
LIBDIR = ../lib
INCDIR = ../include
OBJDIR = obj
CXX = g++
doLib = ar -rs
doCompile = $(CXX) $(CXXFLAGS)
doLink = $(CXX) $(LFLAGS)
doClean = rm -f *.o *~ *.a
#--------------------------------------------------------------------------
# Library
#--------------------------------------------------------------------------
OBJECTS = $(OBJDIR)/html.o \
$(OBJDIR)/http.o \
$(OBJDIR)/object.o
LIBXMLPATH=~/Development/libxml2_2
LIBCURLPATH=~/Development/libcurl
#CDEF += -D__FORIOS__
CXXFLAGS ?= -I ./ -I $(LIBXMLPATH)/include -I $(LIBCURLPATH)/include/curl $(CDEF) -c -ggdb -Wreturn-type -Wformat -pedantic -Wunused-variable -Wunused-label -Wunused-value -Wno-long-long
DISTLIB = http++
#--------------------------------------------------------------------------
# compile lib objects
#--------------------------------------------------------------------------
lib: all
all:
@(echo -; echo Making HTTP++ library..; make $(OBJDIR)/lib$(DISTLIB).a)
$(OBJDIR)/lib$(DISTLIB).a: $(OBJECTS)
@echo Building Lib ...
$(doLib) $@ $(OBJECTS)
clean:
@(echo Cleanup HTTP++ library)
$(doClean)
(cd $(OBJDIR); $(doClean))
install:
@(echo Installing HTTP++ library in ../include ../lib)
(mkdir -p $(LIBDIR); mkdir -p $(INCDIR))
(cp -p *hpp *h $(INCDIR)/ ; cp -p $(OBJDIR)/lib$(DISTLIB).a $(LIBDIR)/)
#--------------------------------------------------------------------------
# Compiler Call
#--------------------------------------------------------------------------
$(OBJDIR)/%.o: %.cc
@echo Compile "$(*F)" ...
$(doCompile) $(*F).cc -o $@
#--------------------------------------------------------------------------
# dependencies
#--------------------------------------------------------------------------
CHECK = def.h
$(OBJDIR)/html.o : html.cc $(CHECK) html.hpp
$(OBJDIR)/http.o : http.cc $(CHECK) http.hpp
$(OBJDIR)/object.o : object.cc $(CHECK) object.hp
最佳答案
GNU make
有许多超出 BSD 上的 make
的扩展(有时在非 BSD 机器上可用 bsdmake
)。你可以看看FreeBSD man page for make
查看差异,但最突出的是语法
%.target: %.source
仅在 GNU make
上可用(在 BSD make 中有类似的语法,但不太灵活)。
不过,我原以为 gmake
会起作用。嗯……
查看 makefile,我看不到任何创建 $(OBJDIR)
的东西,所以它可能就是问题所在——这是我的第一件事无论如何,请尝试修复。如果是这样,那么事先只需 mkdir obj
就可以了。
关于linux - freebsd 下的 makefile 无法编译(适用于 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002517/