1

我不确定我组织图书馆的方式是最优雅的组织方式。我主要关心的是使我键入的所有代码为我所针对的所有系统编译/运行(保持它的可移植性),并使其对每个系统保持最新。

例如:我不确定使用 __declspec(dllexport/dllimport) 是否会用于 Mac 或 Linux。我认为不是,但我不知道 Mac/Linux 的等价物是什么。或者另一个例子可能是调用特定的操作系统函数,我尽量避免。但是,诸如:以精确的方式测量某件事发生需要多长时间*,确实需要我调用操作系统特定的函数。

*如准确获取用户的时间(低至微/毫秒)。

我目前(未来可能更多)瞄准的系统是 Mac、Windows 和 Linux。但是测试每个系统的代码是否可以编译(并正确运行)似乎是在浪费时间。目前,我提议的方式要求我为每个系统制作一个单独的项目。即,我为 Windows 创建了一个 Visual Studio 项目,为 Mac 创建了一个 Xcode 项目,并为 Linux 使用命令行或使用其他一些 IDE。

好的,所以我组织事物的方式的主要问题是:
1. 时间消耗,如为所有系统创建项目并保持每个单独的项目,为每个系统更新。
2. 了解我需要使用的所有 IDE/编译器

请注意,我以前从未真正使用过* Linux,我正在考虑切换。我担心的唯一问题是找到合适的工具供我使用,并找到适合我的合适的发行版,以满足我的需要。如果有 Linux 经验的人可以指导我,或者给我一些是否切换或不切换的建议,我将非常感激。

我真的很喜欢 Visual Studio,而且很长一段时间以来它一直是我的主要 IDE。对于 Linux,我只是不确定是否要放弃 Visual Studio;因为我不知道可用于 Linux 的工具是否可以做 Visual Studio 可以做的事情。我的意思是,它和 Visual Studio 一样用户友好。我害怕学习如何使用 Linux 的工具,我只是不确定是否值得这样做。时间不是这个图书馆的主要因素,我有足够的时间,我还很年轻,并决心在未来将编程作为我的职业。

*我以前用过它,但我从来没有为 Windows 替换过它。

我目前在 BitBucket 上托管我的项目的所有源代码,但目前,我的仓库中只有 RAW 代码。没有项目文件或任何其他工具可以编译它,只有代码和自述文件。我正在考虑使用 Makefile,因为它们看起来很流行。但是我之前从来没有做过Makefile,不要误会,我愿意学习。我只是不确定从哪里开始。我听说人们使用 CMake 来创建可移植库,例如 SFML 和 Ogre3D。我已经用 CMake 构建了几个库,但我不知道如何用它实际制作我自己的库来制作我的项目/制作文件。我应该学习 CMake 并将其与我的库结合,还是有更好的选择?

编辑:

我的目标不是为使用 GUI 的实际软件编写库。我的主要目的是写游戏

4

3 回答 3

3

1 - Boost. Boost will help your portability more than you can imagine. Its only real sticking point is, believe it or not, OS X.

2 - Use CMake. It integrates with Visual Studio project files as the build tool, and you can put most of your different-platform compilation voodoo in there.

3 - If you're seriously writing a portable library, consider writing it in C/writing a C wrapper, or making it header-only, or providing the source-code. Making it a shared or statically linkable library does not mean that it will play nice. Name mangling leads to inconsistencies that will blow your mind.

4 - Always be explicit about the number of bits in each variable.

5 - use git. It'll allow you to setup a crappy local server for a repository very easy and get very fast transfers of the kind of huge changes MSVC will make annoyingly

There are a lot more best-practices that can be discussed about cross-platform development. All of that advice isn't applicable in every case; I have a very code-heavy Linux/Windows library that I code almost exclusively in MSVC2k10 and mostly build/test for in Linux, and it is nowhere close to header-only.

EDIT in response to comments:

git was suggested because I find it very easy to use and manage locally. I've use svn before and liked it, I won't really endorse any others, but there are probably plenty of fine ones.

To expound on point 3, A C wrapper would make it so that anyone anywhere could use your library - FORTRAN developers, Ruby, even Java. Otherwise you generally have to have similar compiler versions to link properly and it will only link to other C++ code, outside the case of DLLs, and there are still versioning issues. It's one of the stupidest problems in C++ left over, check "name mangling" on Wikipedia. There is a reason widely-used libraries are written in C or have C wrappers, such as libz, openssl etc.

There are other advantages to it. Exception propagation across dynamic libraries is non-existent; with static libraries it can be inconsistent or non-existent.

You'll find that the most widely-used C++ libraries are mostly header-only, like Boost. A header-only library solves many problems by putting all the code directly into a project in a relatively intuitive way, and modern compilers can still optimize away much (but certainly not all) of the extra compile time associated with it.

With all this said, it is certainly possible to do without a C wrapper or header-only, it is just annoying and very troublesome. DLL hell and its Linux equivalents still exist.

You also asked about Boost. That depends. If you're distributing the sourcecode then you certainly must distribute Boost with your code/have people install it. Having people install libraries in order to compile other libraries or use programs is common practice. Think of how specific versions of DirectX come with games for an example.

However if you are distributing binary versions of your library, statically linking against Boost will eliminate any need to include it as long as you are careful to keep Boost headers out of the outward-facing parts of your library. This is where you start seeing things like void * pointers inside C++ headers; an unfortunate side-effect of some of the shortcomings of C++ compilation and library distribution unfortunately.

于 2012-07-23T11:53:02.413 回答
1

就我个人而言,我会利用像 Qt 这样的框架,因为它非常便携,它确实抽象了很多操作系统功能(文件、计时、线程、网络),并且你得到了一个体面的、免费的 IDE(Qt Creator),它也是可移植的并在 Windows、OS X 和任何运行 Qt 的 Unix 风格上运行。它会给你最低的进入门槛。Qt Creator 可以利用 Visual Studio 编译器和 CDB 调试器(如果它们可用)。

不需要使用 OpenGL 来使用 Qt,事实上你并没有绑定到任何特定的图形子系统。Qt 仅在 Qt 5 中为 Qt Quick 2 图形后端“使用”OpenGL。Qt 4 和 Qt Quick 1 都不需要它(即使在 Qt 5 中!)。

您可以使用任何您喜欢的 2D 或 3D 框架将图像和其他内容推送到屏幕上。Qt 擅长的是创建游戏中经常需要的那种 2D 图像——菜单、配置屏幕、HUD 等。Qt 可以轻松利用许多控件和绘图原语来实现您的目的。

Qt 还允许您使用相当强大的模型视图和网络框架,因此您可以相当容易地生成实时更新的服务器或客户端列表。

当然,在 Qt 和 DirectX 之间需要有少量的 shim 代码。在输出端,你通常会QImage在 Qt 中结束,然后使用 DirectX、SDL、OpenGL 等将其推送到屏幕上。在输入端,您需要qApp->processEvents()在主游戏循环中调用,并且需要使用qApp->postEvent(...). 仅当 DirectX 主循环使用所有 Windows 消息并且不会让标准 winapi/win32 代码(Qt 的 Windows 事件调度程序)看到它们时才需要这样做。我没有过多地处理 DirectX,所以当然,其他人可以随意加入细节。

于 2012-07-23T11:59:28.297 回答
1

CMake 是一个不错的选择。你可以学习使用它。阅读教程:
http ://www.cmake.org/cmake/help/cmake_tutorial.html

但是,如果您的目标仅是 Linux 和 Windows。在您的情况下(小型/平均第一个多平台项目),维护 2 个独立的构建系统可能是可以的。

  • 在 Linux 上,使用 Make。它是标准的并且有一个很好的参考手册:
    http ://www.gnu.org/software/make/manual/make.html

  • 在 Windows 上。使用您的 IDE 项目文件,无论是 Visual、DevC++ 还是其他。这是最简单的方法。

最重要的是,可以轻松地在不同平台上测试您的库/软件。在桌面上安装虚拟机。或者至少将你的库编译成 Cygwin。

一旦你在这里回来stackoverflow,我们会帮忙!

于 2012-07-23T12:05:38.077 回答