【发布时间】:2010-12-22 01:32:45
【问题描述】:
我正在尝试在 Visual C++ 2010 Express 中构建一个 C 项目作为 C++,以便我可以为它创建一个 C++/CLI .net 包装器。它编译得很好,但链接器告诉我已经定义了 swprintf(...)、vswprintf(...)、_swprintf_l(...) 和 _vswprintf(...)。奇怪的是,它说它们已经在我制作的 .obj 文件中定义了,而且我确信我没有定义它们。事实上,我什至没有给他们打电话。有谁知道是什么原因造成的?
一些说明: 这个库是用纯 C 语言编写的,并在 OS X、FreeBSD、OpenBSD 和 Linux 中构建和运行。将其作为 .net 程序集移植到 Windows 是一项挑战。我读到 C 库必须用 C++ 构建才能获得 C++/CLI 包装器。在将其构建为 C++ 项目时,我必须进行一些调整(例如 malloc 转换),但它仍应保持 C 兼容性。
* 最终更新 *
我不知道我浪费了多少小时试图为我正在编写的文件解析库制作一个 .net 包装器。我已经尝试了几次,每次都失败了。这次我确实比以往任何时候都走得更远,但我仍然无法让它发挥作用。
我最初设想的是一个 3 个项目的解决方案:
- 一个非托管静态库,用 C 语言构建
- 一个托管的 .net 包装器,内置于 C++/CLI 中
- 一个托管的 winforms 应用程序,用 C# 构建
我很快了解到,Visual Studio 的速成版提供的正是您所支付的费用,并且不允许您在一个解决方案中混合使用不同语言的项目。为了做到这一点,我必须为 VS Pro 支付 800 美元,而这不会发生!
我决定用 C++/CLI 编写简单的应用程序来适应这一点。即便如此,它也根本行不通。显然,我要么必须链接第 1 部分中的 .obj 文件(这不起作用,因为它无法使用 /clr 编译 C 文件),要么必须使用 /clr:safe 构建第 2 部分(这会产生各种其他问题) .
我真的不知道这是否是 VS 无用的 Express 版本的限制,或者这是否甚至可以通过荒谬的昂贵版本实现(奇怪的是 800 美元可以获得 VS Pro,但 700 美元可以获得所有 XCode 和一个可以运行的 Mac Mini!Microsoft Dev Tax 任何人?!?)但无论哪种方式,我已经受够了。我的库在 OS X、FreeBSD、OpenBSD、Linux 和 OpenSolaris 上运行良好,但在 Windows 上运行良好,直到 MS 发布了真正有用的免费开发工具并提供了一种使用 PORTABLE 代码的方法(这适用于),我刚刚赢了没关系。
感谢所有给予建议和帮助的人。
jorj
【问题讨论】:
-
有点腥味。这些名称是否出现在您的源文件中任何地方?如果有,在哪里?
-
不,但我确实有几个调用 snprintf(...),我已将其定义为 windows 的 _snprintf(...),这可能被重新定义为有问题的函数名称之一stdio.h.