Makefiles和跨平台开发

6
我一直在尝试创建一个可以编译为所有主要操作系统的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

你能发布一个简略的Makefile和简略的目录结构吗? - Jonathan Rich
你在哪个操作系统上编译?你使用什么图形工具包(如果有的话)?除了 C 标准库之外,你是否使用了任何其他库? - Karl Bielefeldt
1
@FrustratedWithFormsDesigner 那完全不是那个意思。我的意思是我想在 OS X 上为 Windows 构建程序。您似乎认为我想要一种所有操作系统都可以运行的通用二进制文件。 - Justin
2
@FrustratedWithFormsDesigner:在 Mac 上编译 Windows 程序是完全可能的(只需要一点点努力),这被称为交叉编译 - Mac
1
@Justin,不是那么简单。例如,即使你完全坚持使用标准C库和动态链接,你也需要拥有C标准头文件和存根库的Windows版本。如果你在谷歌或StackOverflow上搜索“Windows跨编译”,你会被引导到一堆关于MinGW的文章。这可能是在UNIX系统上设置交叉编译Windows的最简单的方法,但它并不简单。使用像CMake这样的跨平台构建系统并在Windows平台上进行构建可能更容易。 - Charles E. Grant
显示剩余7条评论
1个回答

6
GNU Autoconf是一个不错的起点。我不能给你一个完整的答案,因为我不知道在Windows上该怎么做,除了维护一组nmake脚本。虽然有一个学习曲线,但它使得编写能够跨平台工作的make文件和c代码成为可能。它不仅可以为您处理多个源文件,还可以帮助您定义目标,例如“all”,“install”、“clean”等。如果您熟悉下载项目,然后键入“./configure”,然后是“make install”,那么您可能已经是Autoconf生成的项目的用户。
使用Autoconf的其他原因不止是处理多个源文件。
导致Unix不同的版本和C/C++开发变得困难的因素之一是对Unix和C的定义。不同版本的Unix根据它们支持的标准版本略有不同的库或系统调用。C也是如此。因此,在编写代码时,您会看到#defines指定一组预处理器符号,这些符号定义了您想要使用的Unix和C的版本。从GCC转换到HP C或其他供应商的C编译器可能包括不同的“默认”行为级别,因此您需要使期望的行为明确。
其次,您需要定义所需的库。在您的构建中,您可能需要探测mysql库并决定如果没有安装这些库该怎么办。在某些情况下,您可能根本不需要构建,在某些情况下,您可能只需要替换为另一个库(如libdb)。尝试编写支持两个操作系统(Solaris和Linux)的复杂makefile后,我不想重新发明这个轮子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接