解决VS2008 没法解析的外部符号 "int _cdecl _AfxInitManaged(void)“,以及无法打开预编译头Debug\XXX.pch

本文解决了VC2008工程中预编译头导致的一系列错误,包括vc90.idb vc90.pdb文件无效及无法打开预编译头等问题,并给出了具体的解决方案。

作者:朱金灿

来源:http://blog.youkuaiyun.com/clever101


            今天看到VC2008工程里的预编译属性选项使用了创建预编译头,心想这个会减慢编译速度,就改为使用预编译头,重新编译出现错误:

        vc90.idb vc90.pdb两个文件无效。于是我删除了Debug目录,重新F7。这次得到的是一大堆的 【无法打开预编译头 Debug\XXX.pch】


           百度找了一下,很多文章说什么取消使用预编译头,我认为这不是正确的方法,因为预编译头能加快工程的编译速度,是需要的,


           但是我在工程属性中打开创建预编译头,这次能编译成功了,再改回使用预编译头,又得到 【无法解析的外部符号 "int __cdecl _AfxInitManaged(void)“】

继续google,找到

                     http://social.msdn.microsoft.com/Forums/zh-CN/vclanguage/thread/b3aa10fa-141b-4a03-934c-7e463f92b2a5


         看了一下,原来这样的,右键选择stdafx.cpp,属性,在C/C++中的预编译头下,选择创建预编译头

然后选择工程的属性,右键,属性,在C/C++中的预编译头下,选择使用预编译头,编译正常。


      如果你觉得我的博客对你有帮助,请在下面网址中博客之星评选活动投我一票:

http://vote.blog.youkuaiyun.com/item/blogstar/clever101(单击候选人介绍下面的投他一票那个按钮)

参与投票有机会获奖:

     最佳贡献奖:通过微博分享活动就有机会获得30元充值卡一张(每周抽选5名)
    幸运奖:凡参与投票用户就有机会获得精美小礼品一份。(每周抽选5名)
    积极参与奖:所有参与投票并符合条件的用户均可获得20个下载积分。


链接错误 `LNK2001 unresolved external symbol GetCurCycle` 通常表明编译器在链接阶段无法找到函数或变量 `GetCurCycle` 的定义。以下是可能的原因和对应的解决方法: ### 1. **未正确实现或定义 `GetCurCycle` 函数** 确保 `GetCurCycle` 函数已经在某个源文件中定义,并且其声明与定义一致。如果函数仅在头文件中声明但没有在 `.cpp` 文件中实现,链接器将无法找到该符号。 ```cpp // 示例:在头文件 GetCurCycle.h 中声明 int GetCurCycle(); // 在源文件 GetCurCycle.cpp 中实现 #include "GetCurCycle.h" int GetCurCycle() { return 42; // 示例返回值 } ``` ### 2. **函数定义的链接可见性问题** 如果 `GetCurCycle` 是静态库(`.lib`)或动态库(`.dll`)的一部分,则需要确保: - 静态库或导入库已正确链接到项目。 - 使用 `#pragma comment(lib, "library_name.lib")` 或通过项目设置指定库路径[^1]。 ```cpp // 示例:使用 #pragma 指令链接库 #pragma comment(lib, "mylibrary.lib") ``` ### 3. **函数名称修饰问题(Name Mangling)** C++ 编译器会对函数名进行修饰(name mangling),导致链接时符号名称不匹配。如果 `GetCurCycle` 是以 C 语言风格定义的函数,应使用 `extern "C"` 来避免名称修饰: ```cpp // 声明为 C 风格函数 extern "C" int GetCurCycle(); // 实现时也需使用 extern "C" extern "C" int GetCurCycle() { return 42; } ``` ### 4. **作用域或命名空间问题** 如果 `GetCurCycle` 定义在某个命名空间中,但在调用时未正确限定命名空间,链接器将无法识别该符号。例如: ```cpp // 在命名空间中定义 namespace MyNamespace { int GetCurCycle(); } // 调用时需指定命名空间 int value = MyNamespace::GetCurCycle(); ``` ### 5. **构建配置问题** 检查项目的构建配置是否一致。例如,调试模式(Debug)和发布模式(Release)可能使用不同的运行时库或链接设置。确保所有依赖项都针对当前配置进行了正确构建[^1]。 ### 6. **第三方库集成问题** 如果 `GetCurCycle` 是第三方库提供的函数,确认以下几点: - 第三方库的版本与当前代码兼容。 - 正确设置了包含路径和库路径。 - 使用了正确的编译器选项,如 `_WIN32_WINNT` 或其他平台相关宏定义[^1]。 ### 7. **清理并重新构建项目** 有时旧的中间文件可能导致链接错误。尝试执行完整的清理操作后重新构建整个项目: ```bash # 清理构建 msbuild /target:clean # 重新构建 msbuild ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值