我刚刚通过告诉我的VS 2008项目忽略项目属性菜单中链接器 - >输入部分中的libc.lib来获得编译和运行的应用程序。在我这样做之前,VS给了我一个旧的“致命错误LNK1104:无法打开文件'LIBC.lib'”消息。
如果我忽略了crt,我不确定这个应用程序如何编译,但这显然是我无知的说法。
我检查了C / C ++项目设置,运行时库设置读取了多线程调试dll(/ MDd标志) - 所以我必须在某处链接到VC80 * .dll。
我不知道怎么回事。我一直对visual studio中的crt设置,静态或调试,多线程或非多线程设置感到困惑。从阅读本网站和谷歌我现在的理解有了很大的改进 - 如果你使用dll你没有那么多的代码膨胀,当程序需要它们的东西链接时,可以通过覆盖dll来应用crt更新。换句话说,使用dll的常见原因。
但是多vs单线程版本有什么用?如果我碰巧与静态版本链接,我不能使用win thread或pthreads,这是什么意思?
我听说过但从未完全遵循过的另一件事 - 在一个dll中分配一个对象并将其从另一个dll中解除分配或类似的东西与交叉分配有关。我不是那么好解释(因为我不明白)但我希望你明白我的观点,并能解释那里发生了什么。这是否意味着在我的程序中我不能在一个存在于dll中的类上调用新的ObjectX()?不能意味着,可以吗?
谢谢大家!
答案 0 :(得分:0)
但是多vs单线程版本有什么用?如果我碰巧与静态版本链接,我不能使用win thread或pthreads,这是什么意思?
Windows中没有(本机)pthreads - 所以它更多是Windows线程,但这是基本的想法。但是,VS 2008不支持单线程版本 - 它们已被删除,因此如果您使用VC ++ 2008,则始终使用多线程VC ++运行时库。
我听说过但从未完全遵循过的另一件事 - 在一个dll中分配一个对象并将其从另一个dll中解除分配或类似的东西与交叉分配有关。我不是那么好解释(因为我不明白)但我希望你明白我的观点,并能解释那里发生了什么。这是否意味着在我的程序中我不能在一个存在于dll中的类上调用新的ObjectX()?不能意味着,可以吗?
这在使用与调用项目不同的VC ++运行时编译的DLL中分配对象时更是一个问题。如果使用VS2005编译DLL,然后尝试在VC 2008项目中执行“new MyClass();
”,则可能会遇到问题。
这是由于VC ++运行时版本之间的更改。不同的版本可以自己的方式自由管理内存分配和解除分配。试图在“运行时库”边界上分配或删除往往会导致坏事发生 - 通常情况下,你会崩溃。