我正在尝试使用以下语句使我的 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 的编号错误。论据