如何更改以下Makefile,使其适用于MacOS?

时间:2019-12-18 13:14:38

标签: c linux macos makefile makefile-errors

我曾经在Linux中进行C编程。现在,我有了MacBook,并且想在Mac上进行编程。

我应该如何更改以下makefile?

# Makefile

OBJS = main

$(OBJS): $(OBJS).o
#   gcc -O2 -Wall $(OBJS).c -o $(OBJS)  -I/usr/local/include  -L/usr/local/lib64   -leggx -lX11 -lm
    gcc $(OBJS).c -o $(OBJS)  -I/usr/local/include  -L/usr/local/lib64   -leggx -lX11 -lm

$(OBJS).o: $(OBJS).c
    gcc -c $(OBJS).c

.PHONY: clean
clean:
     rm -f $(OBJS) $(OBJS).o 

1 个答案:

答案 0 :(得分:1)

您将至少要检查以下内容:

  • 您要继续使用gcc作为编译器,还是移至Apple的clang

  • 如果要使用X11,则需要安装 XQuartz 并添加以下选项:

    X11FLAGS=-I /opt/X11/include X11LIBS=-L /opt/X11/lib -lx11

  • 您可以删除/usr/local/lib64,因为 macOS 不使用它

  • 您将要决定要使用软件包管理器,例如 homebrew ,因为Apple不提供软件包管理器。与此相关的是,您可能希望使用自制软件中的pkgconfig来自动执行编译器和链接器标志和开关。

您可能还会发现this很有帮助,this


我修改了Makefile软件包中包含的egg,使其看起来像这样,它可以在macOS Mojave的Mac上编译并正常运行:

CC    = gcc
CFLAGS = -O2 -Wall
DESTDIR =
USERCC   = gcc
USERCCFLAGS = -O2 -Wall
USERFC   = gfortran
USERFCFLAGS = -O2 -Wall

IINC  = -I/opt/X11/include
LLIB  = -L /opt/X11/lib

PREFIX = /usr/local

INCDIR = $(PREFIX)/include
LIBDIR = $(PREFIX)/lib
BINDIR = $(PREFIX)/bin

LOCALINC = -I$(INCDIR)
LOCALLIB = -L$(LIBDIR)

LLINKS = -leggx -lX11 -lm

DEFS = $(VDEFS) $(TDEFS) $(UDEFS) $(PDEFS) $(XDEFS)

all:: _xslave_ mkexheader exec_xslave.h lib egg

install:: lib egg
    if [ ! -d $(DESTDIR)$(LIBDIR) ];then sh install-sh -d $(DESTDIR)$(LIBDIR); fi
    if [ ! -d $(DESTDIR)$(INCDIR) ];then sh install-sh -d $(DESTDIR)$(INCDIR); fi
    if [ ! -d $(DESTDIR)$(BINDIR) ];then sh install-sh -d $(DESTDIR)$(BINDIR); fi
    sh install-sh -m 644 libeggx.a $(DESTDIR)$(LIBDIR)
    sh install-sh -m 644 eggx*.h $(DESTDIR)$(INCDIR)
    sh install-sh -m 755 egg $(DESTDIR)$(BINDIR)
    ranlib $(DESTDIR)$(LIBDIR)/libeggx.a

.c.o:   ; $(CC) $(CFLAGS) $(IINC) $(DEFS) -c $*.c

_xslave_: _xslave_.o _eggx_scrollbar.o
    $(CC) $(CFLAGS) _xslave_.o _eggx_scrollbar.o -o _xslave_ $(LLIB) -lX11

mkexheader: mkexheader.o
    $(CC) $(CFLAGS) mkexheader.o -o mkexheader

exec_xslave.h: mkexheader _xslave_
    ./mkexheader _xslave_ > exec_xslave.h

eggx_base.o: exec_xslave.h

lib:: eggx_base.o eggx_color.o
    ar cruv libeggx.a eggx_base.o eggx_color.o
    ranlib libeggx.a

egg:: egg.sh
    cat egg.sh > egg
    rm -f egg.t
    for i in USERCC "x@@$(USERCC)" USERFC "x@@$(USERFC)" \
      USERCCFLAGS "x@@$(USERCCFLAGS)" USERFCFLAGS "x@@$(USERFCFLAGS)" \
      IINC "x@@$(IINC)" LLIB "x@@$(LLIB)" LOCALINC "x@@$(LOCALINC)" \
      LOCALLIB "x@@$(LOCALLIB)" LLINKS "x@@$(LLINKS)" ; do { \
      if [ -f egg.t ] ; then \
        if [ "$$i" = "x@@" ] ; then \
          cat egg.t | sed -e "s|@@@TARGET@@@||" > egg ; \
        else \
          cat egg.t | sed -e "s|@@@TARGET@@@|$$i|" | sed -e 's|x@@||' > egg ; \
        fi ; \
        rm -f egg.t ; \
      else \
        cat egg | sed -e "s|@$$i@|@@@TARGET@@@|" > egg.t ; \
      fi ; \
    } done
    chmod 755 egg

clean::
    rm -f *.o *.exe egg egg.t libeggx.a _xslave_ mkexheader exec_xslave.h

如果将tarball中的eggx保存在目录HOME/eggx中,则需要执行以下操作:

cd $HOME/eggx
tar -xvf eggx-0.93r5.tar
cd eggx-0.93r5

然后从上方复制修改后的Makefile并将其另存为Makefile在该目录中。现在运行:

make

它应该一切正常。