1

所以我在无法链接任何运行时库或使用异常的环境中工作。但是,我们想利用 BOOST 或 STL。最初我们尝试在 boost::container::string/vector/map/... 中进行链接,但无法解决链接器错误。

所以目前我正在尝试链接 STL 的标头,为此我定义了以下预处理器指令:

#define _HAS_ITERATOR_DEBUGGING 0

#define _HAS_EXCEPTIONS 0

我能够成功地与#include 链接,并且我能够实例化一个std::vector,但是当我调用push_back(32); 时 在向量上,我收到以下链接器错误:

error LNK2001: unresolved external symbol "void (__cdecl* std::_Raise_handler)(class stdext::exception const &)" (?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA)
error LNK2001: unresolved external symbol _invoke_watson
error LNK2001: unresolved external symbol "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z)

我们正在使用 Visual Studio 2010(它是默认编译器)。我们希望在不久的将来迁移到 vs2012,如果它有助于解决这些错误,可以加快迁移速度。

在这些限制下(没有例外,没有运行时库)有没有办法链接 boost 或 STL?

谢谢!我们真的不想因为我们的环境限制而错过 STL/boost 的好处

4

3 回答 3

3

这取决于您需要什么,但可能不是。

C++ 标准库中的所有容器都需要内存分配,它包含在运行时库中。所以,你不能:

std::vector<>
std::set<>
std::map<>
std::list<>

您也许可以使用

std::array<>
std::tuple<>

但你也可能不会。

所有的流都需要内存分配,而且大多数流都需要文件 i/o 系统调用,所以它们也被淘汰了。

由于不能使用容器,迭代器的大部分功能不再有用。

好消息是大多数 Boost 支持仅是标头,因此您不需要链接到 Boost 库。对于 Boost,只需尝试#include使用适当的标头即可。如果它编译和链接,你赢了。

于 2012-09-13T19:46:06.760 回答
2

首先,澄清一点。您不需要 Boost 即可使用标准模板库。STL 很久很久以前作为 C++ 标准库的一部分并入 C++。您已经将它作为 Visual Studio 2010 的一部分。

您需要通过无法“链接任何运行时库”来澄清您的意思。您甚至不允许使用标准的 C 和 C++ 运行时库吗?这意味着没有 I/O,没有数学函数,没有new,没有delete,什么都没有。如果您被允许使用标准库,那么您已经拥有了 STL。

然而,这里有一个问题。这个问题是 C++ 标准库抛出异常。异常是标准库函数报告错误的首选机制。如果这些函数std::bad_alloc无法按要求分配内存,则它们会抛出std::out_of_range,当您使用检查事物是否在范围内的访问器时它们会抛出,等等。throw在这些标准头文件中有很多调用。

您的“不抛出异常”是否仅适用于您,还是也适用于标准库?如果它适用于库以及你的程序员,你可以注销 C++ 容器、C++ I/O、C++ 字符串和几乎所有的 Boost。

于 2012-09-13T20:07:09.243 回答
1

为了消除标准库中的异常,您需要一个不使用异常的库构建。设置这些宏是构建和使用此类库的一部分。我不认为微软发布了他们的库的无异常版本,但如果他们这样做了,你需要链接到它而不是正常的。如果没有,您需要考虑从 Dinkumware(向 Microsoft 提供该库的公司)获得该库的许可。www.dinkumware.com。

于 2012-09-13T20:12:25.377 回答