VxWorks上的STL错误

我在程序中使用了STL,但是下载时,出现了链接错误:

Errors while downloading PPCEC603gnu/Project1.out: clone__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03Rep eos__t18string_char_traits1Zc replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0UiUiPCcUi _t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0$nilRep __dl__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03RepPv length__t18string_char_traits1ZcPCc assign__t18string_char_traits1ZcRcRCc

程序代码如下:

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstdio>

using namespace std;


int main(void)
{
	map<int, int> mapInt;
	mapInt[12] = 1222;
	mapInt[13] = 1333;

	if (1222 == mapInt[12])	cerr << "Right!/n";
	if (1333 == mapInt[13]) cerr << "Right!/n";

	string str = "hello";
	printf("%s/n", str.c_str());

	vector<int> arrInt;
	arrInt.push_back(2);
	arrInt.push_back(3);

	vector<int>::iterator itArrInt;
	for (itArrInt = arrInt.begin(); itArrInt != arrInt.end(); ++itArrInt)
	{
		cerr << *itArrInt << "/t";
	}
	cerr << endl;

	return 0;
}
但是, VxWorks是支持STL的。在 VxWorks Programmer's Guide中有明确表明STL:

Standard Template Library (STL) For both toolchains, the Standard Template library consists entirely of a set of header files. There is no special run-time component that must be included in a VxWorks system.

STL for GNU The GNU STL port for VxWorks is thread safe at the class level. This means that the client has to provide explicit locking, if two tasks want to use the same container object (a semaphore can be used to do so; see 2.3.3 Semaphores). However, two different objects of the same STL container class can be accessed concurrently.

The C++ Standard Template Library can be used in client code compiled with exception handling turned off. In our implementation this has the following semantics:

For all checks that could reasonably be made by the caller, such as bounds checking, no action is taken where an exception would have been thrown. With optimization on, this is equivalent to removing the check. For memory exhaustion where bad_alloc would have been thrown, now the following message is logged (if logging is included): "STL Memory allocation failed and exceptions disabled -calling terminate" and the task calls terminate. This behavior applies only to the default allocators; you are free to define custom allocators with a different behavior.

在FAQ上也发现,它是支持STL的,只不过会使代码显得比较大:

Q. When compiling C++ code (STL) the object size explodes

A: People are confusing C++ with STL. They are not the same. There is an embedded C++ standard that will significantly reduce the size of an executable if you follow the restrictions.

Compile with "-fno-exceptions". If you are using templates that require exceptions handling, i suggest you don't. Alternatively, you can look that the offending vxWorks STL file (maybe stl_alloc.h) and there is an "if 0" condition that should be changed to "if 1". Also disable RTTI with "-fno-rtti" as the another poster noted. You might also consider using "-fno-volatile", etc.

If you don't use templates, but just classes and polymorphism, you can make your own collections that are significantly smaller than STL. (even when you do use templates).

Other alternatives might be to look at PJ Plaugher's STL.

(From: Bill Pringlemeir, spam_account@sympatico.ca)

而且,对于set, map, vector,都没有报错,只有string报错。经过反复查找资料,才确定只与string无关,与STL有关,并且在programmer's guide中以下描述:

7.2.2 Adding Support Components By default, VxWorks kernels contain only minimal C++ support. You can add C++ functionality by including any or all of the following components:

Basic Support Components ...

C++ Library Components Several C++ library components are also available.

GNU-Specific Library Support Components For the GNU compiler, these are:

INCLUDE_CPLUS Includes all basic C++ run-time support in VxWorks. This enables you to download and run compiled and munched C++ modules.

INCLUDE_CPLUS_STL Includes support for the standard template library.

INCLUDE_CPLUS_STRING Includes the basic components of the string type library.

这时候,再去查看configAll.h,才发现确实未定义INCLUDE_CPLUS_STRING宏。

结论:对编译过程、库、gcc了解太少了,查起这种问题,根本没有头绪。

### VxWorks Workbench 编译错误解决方案 当面对VxWorks Workbench编译过程中出现的错误时,解决问题的关键在于理解具体的错误信息并采取针对性措施。通常情况下,常见的编译错误可能涉及以下几个方面: #### 1. 环境配置不当 如果工作环境中缺少必要的库文件或头文件路径未被正确指定,则可能导致编译失败。确保所有依赖项都已安装,并且环境变量已经按照官方文档的要求进行了设置[^3]。 对于Windows下的交叉编译场景,在启动VxWorks Development Shell之前应当确认`tao_idl.exe`, `ace_gperf.exe`等相关工具链组件已被加入到系统的PATH中去;否则就需要手动添加这些二进制文件所在的目录至PATH环境变量里。 #### 2. 版本兼容性问题 不同版本之间可能存在API变更或其他不兼容之处。因此建议开发者始终使用与目标平台相匹配的工作台版本来进行开发活动。例如,针对特定硬件架构(如ARM、Intel 或 PowerPC)选择对应的编译器选项[^4]。 此外,还需注意所使用的第三方库是否支持当前的操作系统版本。比如ACE+TAO框架在某些旧版VxWorks上的应用可能会遇到困难,此时应考虑升级相关软件包或是寻找替代品。 #### 3. 语法或逻辑缺陷 源码中存在的编程失误也会引发编译报错。这包括但不限于拼写错误、缺失分号等问题。仔细阅读编译日志可以帮助定位具体位置及其上下文信息,从而更快速地修正此类问题。 为了提高排查效率,可以利用Wind River Workbench内置的强大调试功能来逐步跟踪执行流程,找出潜在隐患所在。该IDE不仅提供了图形化的界面操作方式,还集成了多种实用插件和服务,有助于加速整个开发生命周期内的各项任务完成进度。 ```bash # 假设遇到了链接阶段找不到符号的情况 $ make clean all ``` 通过上述方法论指导实践过程中的每一个环节,相信大多数常规性的编译难题都能够得到有效化解。当然,实际工作中还会碰到更加复杂棘手的情形,这时不妨查阅官方技术支持论坛寻求帮助,或者参考其他同行分享的经验教训作为借鉴。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值