linux - freebsd 下的 makefile 无法编译(适用于 linux)

标签 linux compilation compiler-errors makefile freebsd

我得到了下面的 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/

相关文章:

c++ - SMTP编译错误

linux - 在 linux 命令行中使用低功耗蓝牙

linux - 如果特定字符串在 bash 中使用 sed 在模式之间匹配,则在前后添加字符串

linux - 无法编译包含 <linux/leds.h> 的 C 程序

java - Java : Longest Ascending substring

linux - 如何修复错误 : bad value (native) for -march= switch and -mtune= switch?

linux - .deb 安装程序 (linux) 依赖项。如果它不在存储库中怎么办?

linux - 构建 PostgreSQL 时链接器错误 "undefined reference to SSL_get_peer_certificate"

c - 如何释放 uint32_t 指针?

compilation - RISC-V 压缩指令子集 (RVC) 是否总是在二进制文件中组装成 32 位指令?