c++ - 投影 makefile 以进行调试/发布配置

标签 c++ makefile

需要您帮助投影 makefile。所以,我拥有什么,我想要得到什么。我需要构建两个可执行文件。源代码很常见。预处理器宏控制两个 exe 的差异,例如在 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

Screenshot of dirs tree here.

我想使用隐式规则进行编译,如下所示:

%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $(O_DIR)/$@

但是如何为每个目标 int $(TARGETS) 和每个构建配置指定单独的 O_DIR?我的主要问题就在这一步。我可以粘贴目前拥有的所有 makefile,但它仍然无法构建任何内容。以防万一,它是:http://pastebin.com/jjB5Ld1s

提前谢谢各位!

最佳答案

有很多方法可以做到这一点。最简单的似乎是通过递归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

关于c++ - 投影 makefile 以进行调试/发布配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239115/

相关文章:

c++ - 网络消息格式化大量的 char、int,在 C\C++ 中转换

c++ - SDL_ttf 未正确运行

javascript - 从 coffeescript 编译后使用 makefile 合并 javascript 文件

makefile - 如何指定./configure的参数 '--includedir'和 '--libdir'给cmake

c - Makefile "makefile"中的 "kaodv.o: $(KOBJS) Makefile"是什么意思

C++ 偶数或奇数程序无法正常工作

C++ 模板函数默认值

c++ - 在C++中动态创建指针函数

c - 如何使用现有文件创建新的 Xcode 项目?

linux - 返工查找命令以使用其他扩展