c - 平台条件 makefile

标签 c makefile cross-platform

我正在尝试使用以下语句使我的 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/

相关文章:

c++ - 如何在 Qt 中获取硬件 ID

c++ - 获取配置文件的跨平台路径(C/C++)

c++ - 如何有效地计算第n个n位回文?

makefile - 构建具有多个目标的多个文件

gcc - 尝试安装gcc-4.8.1时,使用 "Error 2"退出

c++ - Qt Creator 中的通用 C++ 项目 - 没有制定目标的规则

php - 用python加密数据,用php解密

c - 来自 k&r 的表查找安装功能

c - 程序总是输出0

c - 错误 C2143 : syntax error : missing ';' before 'type'