1

我刚刚通过告诉我的 VS 2008 项目忽略项目属性菜单的链接器->输入部分中的 libc.lib 来编译和运行应用程序。在我这样做之前,VS 给了我旧的“致命错误 LNK1104:无法打开文件 'LIBC.lib'”消息。

如果我忽略 crt,我不确定这个应用程序是如何编译的,但这显然是我的无知。

我检查了 C/C++ 项目设置,运行时库设置读取多线程调试 dll(/MDd 标志)——所以我必须在某处链接到 VC80*.dll。

我不确定如何。我一直对visual studio中的crt设置感到困惑,静态或调试,多线程与否。通过阅读这个网站和谷歌,我现在对我的理解有了一个粗略的改进——如果你使用 dll,你没有那么多的代码膨胀,当程序需要它们时链接,可以通过覆盖 dll 来应用 crt 更新。换句话说,使用 dll 的常见原因。

但是多线程版本与单线程版本有什么关系?如果我碰巧与静态版本链接,我不能使用 win 线程或 pthreads,这意味着什么?

我听说过但从未完全关注过的另一件事——在一个 dll 中分配一个对象并从另一个 dll 中重新分配它时存在问题,或者类似的事情,与交叉分配有关。我解释得不是很好(因为我不明白),但我希望你明白我的意思,并能解释那里发生了什么。这是否意味着在我的程序中我不能在 dll 中的类上调用 new ObjectX() ?不能这么说吧?

感谢大家!

4

1 回答 1

0

但是多线程版本与单线程版本有什么关系?如果我碰巧与静态版本链接,我不能使用 win 线程或 pthreads,这意味着什么?

Windows 中没有(本机)pthreads - 所以它更多的是 Windows 线程,但这是基本思想。但是,VS 2008 不支持单线程版本 - 它们已被删除,因此如果您使用 VC++ 2008,您将始终使用多线程 VC++ 运行时库。

我听说过但从未完全关注过的另一件事——在一个 dll 中分配一个对象并从另一个 dll 中取消分配它时存在问题,或者类似的事情,与交叉分配有关。我解释得不是很好(因为我不明白),但我希望你明白我的意思,并能解释那里发生了什么。这是否意味着在我的程序中我不能在 dll 中的类上调用 new ObjectX() ?不能这么说吧?

这更多的是在 DLL 中分配对象的问题,该 DLL 是使用与调用项目不同的 VC++ 运行时编译的。如果你用 VS2005 编译一个 DLL,然后尝试new MyClass();在 VC 2008 项目中做“”,你可能会遇到问题。

这是由于在 VC++ 运行时版本之间进行的更改。不同的版本可以自由地以自己的方式管理内存分配和释放。尝试跨“运行时库”边界分配或删除往往会导致坏事发生 - 通常,您会崩溃。

于 2009-09-26T00:25:29.973 回答