【问题标题】:makefile under freebsd does not compile (works on linux)freebsd 下的 makefile 无法编译(适用于 linux)
【发布时间】:2014-09-23 18:45:46
【问题描述】:

我得到了下面的 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 了解不多,而且我可以通过 google 找到的 freebsd 手册以及任何示例 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

【问题讨论】:

    标签: linux compilation compiler-errors makefile freebsd


    【解决方案1】:

    GNU make 在 BSD 上的 make 之外还有许多扩展(有时在非 BSD 机器上以 bsdmake 的形式提供)。您可以查看FreeBSD man page for make 以了解差异,但最显着的是语法

    %.target: %.source
    

    仅在 GNU make 上可用(在 BSD make 中有类似的语法,但不太灵活)。

    不过,我原以为gmake 会起作用。嗯……

    查看 makefile,我看不到任何创建 $(OBJDIR) 的东西,所以 可能 就是问题所在 - 这是我首先要尝试解决的问题,无论如何.如果是这样,那么事先 mkdir obj 可能会起作用。

    【讨论】:

    • 你的意思是我应该手动创建目录,还是创建一个依赖/规则来创建它?因为这个目录已经存在(也在linux上,如果它不存在,我必须手动创建它)。那么如何将%.target: %.source 语法替换为适用于所有系统的语法?
    • 我的意思是手动创建它(假设你想避免编辑这个makefile)。如果obj/ 目录存在,那么……不确定。 $(OBJDIR)/%.o 规则看起来应该回显正在编译的文件,而您引用的 gmake 中没有显示,这让我感到困惑。命令gmake -d 将显示相当丰富的调试输出,指示gmake 认为哪些文件是最新的,哪些不是最新的。鉴于 makefile 和 bsdmake 的要求,我倾向于去掉 $(OBJDIR) 的东西并(小心地)用 .cc.o: 替换 %.o: %.cc,这是 bsdmake(和 gmake)的替代品。
    【解决方案2】:

    昨天我发现了问题:

     all:
        @(echo -; echo Making HTTP++ library..; make $(OBJDIR)/lib$(DISTLIB).a)
    

    当 makefile 与 gmake 一起使用时,这一行是错误的,因为它调用 make 而不是 gmake强>。所以解决方法是:

    all:
        @(echo -; echo Making HTTP++ library..; gmake $(OBJDIR)/lib$(DISTLIB).a)
    

    现在在使用gmake 时无需任何调整即可完美运行。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多