3

在编写一个想要在 mac、linux 和 windows 上编译的应用程序时,管理需要包含在各种操作系统中的不同库的最佳方法是什么。例如,使用 glut opengl 工具包需要在每个操作系统上使用不同的包含。

4

8 回答 8

2

Your question is actually two questions in one:

1) How do I write my C++ code to include the right include files on the right platform?

2) How do I write my Makefile to work on different platforms?

The C++ code question is already answered - find the platform-specific defines and use them to figure out what platform you're on.

Automake or scons are quite complex, and are worth your time only if you intend to release your code to a wide audience. In the case of in-house code, a "generic" makefile with per-platform include is usually sufficient. For Windows, you can get GNU Make for Windows (available from here, or use nmake and limit yourself to the subset of syntax common between all platforms.

于 2008-09-22T19:35:54.720 回答
1

There is a good article on Macros. One of the answers how to use conditional compilation based on OS/COmpiler (its near the top).

The use of the Autoconfiguration tools is a nice addition on top of this but is not needed for small projects where it may be easier to detect the OS explicitly, though for larger projects that may need to run on many different types of OS you should also explore the Available autoconfiguration tools mentioned by Branan

于 2008-09-22T19:20:12.183 回答
1

如果您只需要担心头文件,那么预处理器将完成您需要的一切。如果你想处理不同的源文件,可能还有不同的库,你需要一个工具来处理它。

一些选项包括:

我个人最喜欢的是 CMake。Autotools 使用相对容易破解的多阶段过程,而 scons 对我来说感觉很奇怪。除了 makefile 之外,Cmake 还将为各种 IDE 生成项目文件。

于 2008-09-22T18:37:09.307 回答
0

我从事过的几个项目使用基于 autoconf 的配置脚本来构建 Makefile,因此您可以通过简单的方式从源代码构建所有这些项目:

./configure
make
make install
于 2008-09-22T18:19:09.633 回答
0

Scons有一个配置机制,可以在不复杂的情况下完成许多 autotools 的工作,并且非常便携(尽管不如 autotools 便携)。

于 2008-09-22T18:22:16.410 回答
0

编译器应该有一组预处理器符号,它将提供您可以使用的符号。例如linux用于 Linux 系统上的 gcc,_WIN32 用于 VC++。如果您需要更复杂的东西,请查看autoconf,但这最适合基于 Unix 的代码。

我建议查看一些较大的开源项目是如何处理这个问题的。请参阅Apache Xerces(旧版本)的AutoSense.hpp

于 2008-09-22T18:25:13.033 回答
0

如果库在不同平台上提供相同的 API,我将创建一个“代理”包含文件,其中包含所有必要#ifdef的 s。然后,该“平台无关”包含文件将包含在您的客户端代码中,而不是用大量难看的预处理器命令将其弄乱。这些将包含在丑陋而杂乱的独立于平台的包含中。

如果 API 跨平台不同,您将需要创建自己的抽象。

于 2008-09-22T18:31:27.450 回答
0

也许这是一个逃避的答案,但你有没有看过 boost 如何处理这个问题?他们在很多没有 autoconf 的平台上构建,尽管他们确实有自己构建系统 - bjam - 可能处理一些相同的情况。他们还在 windows 上做了一个很好的自动链接技巧,根据 MSVC 编译器的版本自动选择正确版本的库进行链接。根据您最初的描述,听起来只是检查各种平台/编译器的宏定义可能会奏效,但也许您的问题还有更多可以防止这种情况发生。

于 2008-09-22T18:50:51.757 回答