c ++链接stl没有运行时库

时间:2012-09-13 19:36:29

标签: c++ exception stl runtime libraries

所以我在一个我们无法链接任何运行时库或使用异常的环境中工作。但是我们希望利用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的好处

3 个答案:

答案 0 :(得分:3)

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

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

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

您可以使用

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

但你可能也不会。

所有流都需要内存分配,大多数流都需要文件i / o系统调用,所以它们也都没有。

由于您无法使用容器,因此迭代器的大部分功能都不再有用。

好消息是大多数Boost支持仅限于标题,因此您无需与Boost库链接。对于Boost,只需尝试#include相应的标题即可。如果它编译和链接,你就赢了。

答案 1 :(得分:2)

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

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

但是,这里有一个问题。这个问题是C ++标准库抛出了异常。例外是标准库函数报告错误的首选机制。如果这些函数无法根据需要分配内存,则会抛出std::bad_alloc,当您使用检查事物是否在范围内的访问器时,它们会抛出std::out_of_range。有很多{{1}的调用在那些标准标题中。

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

答案 2 :(得分:1)

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