首页 > 解决方案 > 如何更改以下 Makefile 以使其适用于 MacOS?

问题描述

我曾经在 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 

标签: clinuxmacosmakefile

解决方案


您至少需要查看以下内容:

  • 你想继续gcc用作你的编译器,还是转移到苹果的clang

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

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

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

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

您可能还会发现很有帮助,而且这个.


我修改了包中Makefile包含的内容,egg使其看起来像这样,它可以在我的 Mac 上的 macOS Mojave 下编译和构建:

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

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

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

然后从上面复制修改Makefile并将其保存在该目录中为Makefile. 现在只需运行:

make

它应该一切都很好。


推荐阅读