我正在尝试使用以下语句使我的 Makefiles 平台成为有条件的:
ifeq ($(UNAME), Linux)
# LINUX version
program_NAME := lib$(TARGET).so
OBJDIR = ../build/linux
endif
ifeq ($(UNAME), MINGW32_NT-6.1)
# WINDOWS version
program_NAME := lib$(TARGET).dll
OBJDIR = ../build/windows
endif
和:
ifeq ($(UNAME), Linux)
# LINUX version
program_INCLUDE_DIRS := \
/home/ben/projects/g2/src \
/home/ben/projects/pulse_IO/src \
/home/ben/projects/core/src
endif
ifeq ($(UNAME), MINGW32_NT-6.1)
# WINDOWS Virtual Machine version
program_INCLUDE_DIRS := \
E:/g2/src \
E:/pulse_IO/src \
E:/core/src
endif
然后,我在 Linux 或 Windows 7 下编译 src,在 Linux 主机操作系统上作为虚拟机(通过 virtualbox)运行。我尚未解决的问题是如何获取目标文件以及生成的共享库或可执行文件写入特定于平台的目录,例如/build/linux
或 /build/windows
,其中源代码位于 /src
如您所见,我添加了一个 OBJDIR
变量,但我不知道如何使用它来重定向 .o、.so、.dll、.exe
文件到平台上有条件的正确目录。我确信这应该很容易,但我的研究一直因有关 vpath
使用的文章而陷入困境,我认为这不是我所追求的。
我认为我需要修改的 Makefile 部分如下:
LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
$(program_NAME): $(program_OBJS)
$(LINK.c) -shared -Wl,-soname,$(program_NAME) $(program_OBJS) -o $(program_NAME)
我可能应该使用一些更智能的东西,比如 autotools 或 cmake,但现在就让它工作就太好了。
还应该添加,我的目标文件列表创建如下:
program_C_OBJS := ${program_C_SRCS:.c=.o}
尝试过:
program_OBJS := $(addprefix $(OBJDIR)/$program_C_OBJS)
但是请提示addprefix 的编号错误。参数
最佳答案
对于 gmake,请参阅 Here :
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
all: $(OBJS)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
关于c - 平台条件 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603075/