我一直在试图弄清楚如何创建一个可以为所有主要操作系统编译的C程序。我考虑过使用makefile,所以我只需更改目标操作系统,但是我遇到了一些问题。我的第一个问题是我无法弄清楚如何更改目标操作系统,因此我可以在一个操作系统上编译,但在所有操作系统上使用该应用程序。我的第二个问题是我无法弄清楚如何让它自动编译src目录中的所有.c文件,所以每次添加新文件时我都不必修改makefile。有人知道怎么做这个吗?
我当前的makefile(目前未从here修改)
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
答案 0 :(得分:6)
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),我不想重新发明这个轮子。