链接器错误:当我根本没有定义时,已在我的项目中定义

时间:2010-12-22 01:32:45

标签: c++ c windows linker

我正在尝试使用C ++在Visual C ++ 2010 Express中构建一个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项目解决方案:

  1. 一个非托管静态库,内置于C
  2. 一个托管的.net包装器,内置于C ++ / CLI
  3. 一个托管的winforms应用程序,内置于C#
  4. 我很快就了解到,Visual Studio的快速版本为您提供了为您支付的确切版本,并且不允许您在单个解决方案中混合使用不同语言的项目。为了做到这一点,我将不得不为VS Pro支付800美元而且这种情况不会发生!

    我通过决定在C ++ / CLI中编写简单的应用程序来适应这一点。即便如此,它根本行不通。显然,我要么必须链接第1部分的.obj文件(这不起作用,因为它无法使用/ clr编译C文件)或使用/ clr:safe构建第2部分(这会产生各种其他问题)

    我真的不知道这是否是VS的无用Express版本的限制,或者甚至可以使用荒谬的昂贵版本(奇怪的是,800美元可以让你获得VS Pro,但700美元可以让你获得所有的XCode和运行的Mac Mini!微软开发税任何人?!?)但无论如何,我已经受够了。我的库在OS X,FreeBSD,OpenBSD,Linux和OpenSolaris中运行良好,但不适用于Windows,直到MS发布实际有用的免费开发工具并且实际上提供了使用PORTABLE代码的方法(这适用于),我刚赢了不在乎。

    感谢所有提供建议并试图提供帮助的人。

    jorj

5 个答案:

答案 0 :(得分:1)

您可以检查所有项目和文件是否使用相同的公共运行时库(属性| C \ C ++)并检查运行时库设置。包括多线程调试DLL(\ MDd)CRT和多线程DLL(\ MD)或其他与CRT库混合可能会导致类似这样的事情。

您可以发布链接器输出吗?它是否提及有关\ NODEFAULTLIB的任何内容?

答案 1 :(得分:0)

这通常是由链接使用不同选项或不同运行时库生成的对象引起的。我猜你的一些对象是在启用调试选项的情况下编译的,而其他对象则不是或类似的。

答案 2 :(得分:0)

因为它们自动包含在CRT运行时vs2010链接中。

如果您尝试导出包含这些内容的函数,可以在前面添加c_吗?

答案 3 :(得分:0)

您可以使用preprocess-to-file选项。这将快速告诉您函数的来源!

你可能正在使用它们的_tcs版本吗?

答案 4 :(得分:0)

@ sirjorj-- swprintf在wchar.h中定义。你在哪些标题#including?