Makefile和跨平台开发

我一直在试图弄清楚如何创建一个可以为所有主要操作系统编译的C程序。 我考虑过使用makefile,所以我只需要更改目标操作系统,但是我遇到了一些问题。 我的第一个问题是我无法弄清楚如何更改目标操作系统,因此我可以在一个操作系统上编译,但在所有操作系统上使用该应用程序。 我的第二个问题是我无法弄清楚如何让它自动编译src目录中的所有.c文件,所以每次添加新文件时我都不必修改makefile。 有谁知道怎么做这个东西?

我当前的makefile(目前尚未修改)

CC=gcc CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@q2 

GNU Autoconf是一个很好的起点。 我无法给你一个完整的答案,因为我不知道你为Windows做什么,除了维护一组nmake脚本。 虽然有一个学习曲线,但它们可以编写跨平台工作的make文件和c代码。 它不仅可以为您处理多个源文件,还可以帮助您定义目标,例如“全部”,“安装”,“清理”等。如果您熟悉下载项目然后键入“./configure”,然后’make install’然后你可能是Autoconf生成的项目的用户。

使用Autoconf还有其他原因,而不仅仅是处理多个源文件。

什么使得Unix的各种风格的C / C ++开发变得困难,是’Unix’和C的定义。不同的Unix风格的库或系统调用略有不同,这取决于它们支持的标准风格。 C也是如此。因此,在编写代码时,您会看到#defines指定一组预处理器符号,这些符号定义了您想要使用的Unix和C版本。 从GCC到HP C或其他供应商的C编译器可能包含不同的“默认”行为级别,因此您需要明确预期的行为。

其次,您需要定义所需的库。 在您的构建中,您可能需要探测mysql库并确定如果未安装这些库,该怎么做。 在某些情况下,您可能根本不需要构建,或者在某些情况下,您可能只是替换另一个库(如libdb)。 尝试编写复杂的makefile以支持两个操作系统(Solaris和Linux),我不想重新发明这个轮子。