0

我已经为 c++ 编写了一个简单的通用 makefile。它在 Debian/Ubuntu 上运行良好。我想知道它是否可以在 MAC OS 上运行。我问这个问题是因为我家里没有 Mac OS,我无法测试。此外,如果你有什么建议,我们走吧。我不确定这些行 CXXFLAGS += -D OSX LDFLAGS := -stdlib=libstdc++ 我确切地说它目前仅用于构建 STL C++ 程序。没有动态库。

# sources (*.cpp)
SRC  := sources
# headers (*.cpp)
INC  := include
MAIN := kwic_personnel.cpp
EXEC := prog

# main file is in current directory or in sources file
ifneq ("$(wildcard $(MAIN))","")
    sources := $(MAIN) $(wildcard $(SRC)/*.cpp)
else
    sources := $(wildcard $(SRC)/*.cpp)
endif
# obj files
objects := $(sources:.cpp=.o)
# dep files
deps    := $(objects:.o=.d)

CXX := g++
CXXFLAGS := -I $(INC) -MMD -MP -g -std=c++17 -Wall -pedantic -Weffc++ -Werror

# OS name
UNAME := $(shell uname -s)

# if linux
ifeq ($(UNAME), Linux)
    # my own choices on compilator with Debian
    LDFLAGS  := -L /usr/lib/x86_64-linux-gnu
    LDLIBS   := -lcurl
# else but mac OS
else
    # NOT SURE ABOUT THAT
    CXXFLAGS += -D OSX
    LDFLAGS  := -stdlib=libstdc++
endif

# linking
$(EXEC) : $(objects)
    @echo "Generation du fichier executable..."
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
    $(RM) $(objects) $(deps)
    @echo "Compilation réussie !"

# compilation of cpp files
$(SRC)/%.o: $(SRC)/%.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $^ -o $@

# remove exec
.PHONY: clean
clean:
    $(RM) $(EXEC)

# dependencies
-include $(deps)
4

1 回答 1

1

我在 Mac 和 Ubuntu 上都使用 gnu make。我做了一堆我会解释的事情。

首先我的 Ubuntu 是通过一个本地 Docker 容器,它 NFS 挂载我的本地 Mac 工作目录。所以我可以在我的 Mac 上进行本地编辑,但可以为 Linux 编译。这意味着如果我在两者上进行构建,我可以构建不同目标的组合。显然,这是有问题的,所以这里有一些技巧。

UNAME := $(shell uname)
MACAPPEND=
LIB_ARGS= -cvrU
ifeq ($(UNAME), Darwin)
    MACAPPEND=-mac
    CXX=clang++
    LIB_ARGS= -cvr
endif
SRCDIR := src
OBJDIR := obj${MACAPPEND}
DEPDIR := .d
BINDIR := bin${MACAPPEND}

然后它对所有东西都是相同的 ${SRCDIR},但 $OBJDIR} 可能会解析为 obj 或 obj-mac。与 bin 和 bin-mac 相同。我用这个编译:

${OBJDIR}/%.o : %.cpp
    $(COMPILE.cc) ${CXXFLAGS} $(OUTPUT_OPTION) $<

请注意,我做了很多这样的事情,我生成了一个 Makefile-Base 并将其填充到 /usr/local/etc 中,然后可以这样做:

include /usr/local/etc/Makefile-Base

如果我正在制作图书馆:

LIBNAME=show${MACAPPEND}
LIB=lib/libshow${MACAPPEND}.a
lib: ${LIB}

${LIB}: ${LIB_OBJ}
    @mkdir -p lib
    ar ${LIB_ARGS} ${LIB} ${LIB_OBJ}
    ranlib ${LIB}

请参阅此处使用并在本文顶部附近定义的 LIB_ARGS。

请注意,我正在做的很多事情是因为我在两个环境中共享我的目录的方式,并且可能在这两个环境中都建立起来。在 Mac 上,您需要特别做的事情很少。

于 2021-04-12T14:45:54.100 回答