4

我一直在试图弄清楚如何创建一个可以为所有主要操作系统编译的 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
4

1 回答 1

6

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

除了处理多个源文件之外,还有其他使用 Autoconf 的原因。

What makes C/C++ development across flavors of Unix difficult is the definition of 'Unix' and C. Different flavors of Unix have slightly different library or system calls depending on what flavor of standards they support. The same is true of C. So, when writing code you'll see #defines specifying a group of preprocessor symbols that define a version of Unix and C that you'd like to use. Going from GCC to HP C or some other vendor's C compiler may include different 'default' levels of behavior, so you need to make the expected behavior explicit.

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

于 2013-03-05T21:43:06.883 回答