需要您的帮助来投影makefile。那么,我有什么,我想得到什么。我需要构建两个可执行文件。源代码很常见。预处理器宏控制两个exes的差异,例如,在main.cpp中:
#if PROJECT_TYPE==FTP
std::cout << "FTP" << std::endl;
#else
std::cout << "SFTP" << std::endl;
#endif
差异不仅存在于源代码中,还存在于用于链接的其他库中:
FTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
-l:libfile.a -l:libfilesearcher.a -l:libftpclient.a -l:libftplib.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libws2_32.a
SFTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
-l:libfile.a -l:libfilesearcher.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libsftpclient.a -l:libws2_32.a -l:libssh.dll
另外,我想用自己的CXXFLAGS和输出目录创建调试/发布构建目标,因此得到以下结果:
TARGETS= ftp_auto_backup sftp_auto_backup
我想使用隐式规则进行编译,像这样使用smth:
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $(O_DIR)/$@
但是如何为每个目标int $(TARGETS)和每个构建配置指定单独的O_DIR?我的主要问题是这一步。我可以粘贴此时所有的makefile,但它仍然不会构建任何东西。以防万一:http://pastebin.com/jjB5Ld1s
先谢谢你,伙计们!
答案 0 :(得分:2)
有很多方法可以做到这一点。最简单的似乎是通过递归Make。 (我不认为这总是一个坏主意。)
.PHONY: release
release: VERSION=Release
.PHONY: debug
debug: VERSION=Debug
release debug:
@$(MAKE) -S ftp_auto_backup sftp_auto_backup VERSION=$(VERSION)
现在制作可执行文件,给定VERSION
。我们可以用另一层递归来处理这两个项目类型,但我们可以不用它(我不会详细介绍预处理器宏和编译器/链接器标志,因为你似乎已经了解它们了 - 我会如果你喜欢,请拼写出来:
OBJ_LIST = foo.o bar.o baz.o
ftp_auto_backup: PROJECT_TYPE=FTP
ftp_auto_backup: $(addprefix $(VERSION)/ftp_auto_backup/obj/, $(OBJ_LIST))
sftp_auto_backup: PROJECT_TYPE=SFTP
sftp_auto_backup: $(addprefix $(VERSION)/sftp_auto_backup/obj/, $(OBJ_LIST))
ftp_auto_backup sftp_auto_backup:
@g++ -Wall $^ -o $@ with various flags
$(VERSION)/ftp_auto_backup/obj/%.o: %.cc
@g++ -Wall -c $< -o $@ with various flags
$(VERSION)/sftp_auto_backup/obj/%.o: %.cc
@g++ -Wall -c $< -o $@ with various flags