【问题标题】:Platform conditional makefiles平台条件生成文件
【发布时间】:2012-05-15 14:36:39
【问题描述】:

我正在尝试使用以下语句使我的 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 主机操作系统上作为 VM(通过 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 的编号错误。论据

【问题讨论】:

  • 两年多后我意识到我应该一直在为 linux 主机上的 windows 进行交叉编译,而不是制作一个可以在两个操作系统下生成本机二进制文件的单个条件 makefile

标签: c makefile cross-platform


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    您使用的是什么编译器和工具集?对于 QNX,它有如下宏:

    $OS
    $CPU
    $PRODUCT
    $PROJECT
    $SECTION
    $VARIANT ($VARIANTLIST, $EXCLUDE_VARIANTLIST)
    

    这些允许您自定义构建结果的目标文件夹和文件名。

    http://www.qnx.com/developers/docs/6.3.2/neutrino/prog/make_convent.html

    其他编译器/工具链也有类似的功能。

    【讨论】:

    • linux下的gcc,windows下的mingw
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2020-10-19
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多