我正在尝试使用以下语句使我的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
文件重定向到平台上的正确dir条件。我确信它应该很容易,但我的研究一直在使用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有错误的号码。参数
答案 0 :(得分:1)
您使用的是什么编译器和工具集?在QNX的情况下,它具有如下的宏:
$OS
$CPU
$PRODUCT
$PROJECT
$SECTION
$VARIANT ($VARIANTLIST, $EXCLUDE_VARIANTLIST)
这些允许您自定义构建结果的目标文件夹和文件名。
http://www.qnx.com/developers/docs/6.3.2/neutrino/prog/make_convent.html
其他编译器/工具链具有类似的功能。
答案 1 :(得分: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)