这个问题搞了我 5 天(包括双休日), 我一定要记录下来。

问题描述

用 Visual Studio 2008 编译 WinCE 7 平台的应用程序,编译没问题,链接时出现了一堆 Link error, 最多的就是 __imp___rt_sdiv

项目结构

在我项目的 sln 文件中有2个projects, 应用程序 a.exe 和 静态链接库 b.lib. 其中 a 用到了 b 中的函数,b.lib 以静态库的方式链接进 a.exe.

Debugging

我当时解决这个问题的思路有 2 种:

1. 参考已有的 WinCE 7 项目 (application + static library) 的项目配置

2. 硬刚这个问题,google "__imp___rt_sdiv"

由于已有现成的WinCE 7 application + static library link 的项目可供参考,于是我先选择了第一种方法。很遗憾,把 C/C++, Linker 中的配置都抄了过来,链接还是相同的错误(后续证明是我抄漏了。。。)。

那就硬刚吧,google  "__imp___rt_sdiv" link error, 发现 "__rt_sdiv" 是 ARM compiler's runtime helper function for signed division, 会被 coredll 解析。在我们程序链接时,如果用到函数的在其他 dll 中,编译器会链接时在 Import Address Table(IAT) 表中加上 "__imp_" 前缀,记录地址,以便程序运行时能跳转并找到对应函数。 使用 dumpbin 命令 dump coredll.dll,发现这个符号确实是有的。

导出的 coredll.txt 中有: 2005  6DD 0004BB68 __rt_sdiv

基于上述信息,我猜测可能是 a.exe 链接的时候没有把 WinCE 的系统库 coredll.dll 链接进去,导致找不到 __rt_sdiv. 很有可能是我的 Visual Studio 配置不对。

于是我又回到了方法1,参考已有正常的项目,打开 .vcproj 文件一行一行地去比对。终于找到了几个有问题的配置,修改如下:

1. 同时修改应用程序和库项目的 Properties -> C/C++ -> Code Generation -> Runtime Library -> Multi-threaded DLL (/MD)

- 我之前有问题的配置是 Multi-threaded (/MT)

2. 同时修改应用程序和库项目的 Properties -> General -> Code Generation -> Use of MFC -> Use Standard Windows Libraries

-  

3. 其他 WinCE 配置参考 - http://www.voidcn.com/article/p-qvbmcyzh-py.html

1. 当前项目右键-属性-平台修改为windows mobile x SDK
  2. 配置属性-C/C++-预处理器-预处理器定义栏里面:NDEBUG;_WIN32_WCE=$(CEVER);UNDER_CE;$(PLATFORMDEFINES);WINCE;_WINDOWS;_USRDLL;TEST_DLL_EXPORTS;$(ARCHFAM);$(_ARCHFAM_);_UNICODE;UNICODE
  3. 链接器-输入-附加依赖项:strmbase.lib strmiids.lib
  4. 链接器-系统-子系统栏-windows CE

___tmainCRTStartup error

这个是另外一个链接问题了,参考 stack overflow 上的答案:

You can do this by adding the following to Properties -> Linker -> Command line:

/ENTRY:"mainCRTStartup"

Reference

https://blogs.msdn.microsoft.com/russellk/2005/03/20/lnk4217/

https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/500949

https://stackoverflow.com/questions/6626397/error-lnk2019-unresolved-external-symbol-winmain16-referenced-in-function

https://social.msdn.microsoft.com/Forums/en-US/55677078-0329-437c-bf80-f2e7c8dbf126/failed-to-link-the-axsample-sample-project?forum=vssmartdevicesnative

error LNK2001: unresolved external symbol __imp___rt_sdiv的更多相关文章

  1. VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>

    最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...

  2. [异常] VC6.0 error LNK2001: unresolved external symbol _main解决办法

    来自:http://www.douban.com/note/65638800/ 学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说 ...

  3. VC6.0 error LNK2001: unresolved external symbol _main解决办法

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过.产生连接错误的原因非常多,尤其LNK2001错误 ...

  4. (转载)浅析error LNK2001: unresolved external symbol "public: __thisc...

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于      编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,      编译都已通过.产生连接错误的原因非常多 ...

  5. MASMPlus编译出错:error LNK2001: unresolved external symbol _WinMainCRTStartup

    初学汇编,感觉很多不懂.不过那也是,如果懂了的话就不用学了,从无到有学习一门编程语言果然不是那么容易的一件事. 学习汇编总得要有一款汇编软件才行,没理由只是使用Windows自带的DEBUG.于是上了 ...

  6. error LNK2001: unresolved external symbol _main

    想运行一个网上下载的opengl离屏渲染(渲染到纹理FBO)的程序,然后一直报错 error LNK2001: unresolved external symbol _main 解决了一下午终于弄明白 ...

  7. VC6.0 error LNK2001: unresolved external symbol __imp__ntohl@4

    --------------------Configuration: oxToint1 - Win32 Debug-------------------- Linking... main.obj : ...

  8. 混合编程:error LNK2001: unresolved external symbol

    Vs2006+matlab2010rb环境: 1:工具-选项-项目解决方案-VC++目录设置include和lib的路径 2:项目-属性-属性配置-链接器-输入-附加依赖项把库的名字添加进去 VIST ...

  9. error LNK2001: unresolved external symbol @__security_check_cookie

    Q:VS2005编译的静态库, 在vc++6.0中连接出现错误 error LNK2001: unresolved external symbol @__security_check_cookie@l ...

随机推荐

  1. ML面试1000题系列(91-100)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 91 简单说说RNN的原理?我们升学到高三准备高 ...

  2. win10 请求操作需要提升解决方案

    记录一下: win10   系统管理员 打开后缀为  .xxx 的文件时, 系统提示: 请求操作需要提升 网上搜索了一下,原因是权限不够,故系统提示. 给当前用户加入了 管理员权限,各种权限都无效. ...

  3. 2016年中国独角兽企业估值榜 TOP300

    2016年中国独角兽企业估值榜 TOP300[完整榜单] 类型:品牌资讯/名企动态 阅读:6735次 来源: 中商情报网 我要评论   摘要:独角兽公司是什么?独角兽公司指的是那些估值达到10亿美元以 ...

  4. js计算精度问题(浮点数误差,大数计算出错)

    https://github.com/camsong/blog/issues/9 0.1+0.2 //0.30000000000000004 1-0.9 //0.09999999999999998 9 ...

  5. 一款优秀的前端JS框架—AngularJS

      前  言 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML,且通过 表 ...

  6. 2019-5-13-WPF-从触摸消息转触摸事件

    title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-05-13 09:43:48 +0800 2019-05-12 ...

  7. 写一个杀死Gradle Daemon的shell脚本和bat脚本

    1. Gradle Daemon也就是Gradle守护进程 Gradle需要运行在一个Java虚拟机中,每一次执行gradle命令就意味着一个新的Java虚拟机被启动,然后加载Gradle类和库,最后 ...

  8. Linux常用命令6 压缩解压命令

    .zip是Linux和Windows共有的压缩格式 1.压缩解压命令:gzip 命令英文原意:GNU zip   命令所在路径:/bin/gzip 执行权限:所有用户 语法: gzip [文件]   ...

  9. JavaScript--函数表达式与函数声明的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. var与let循环中经典问题

    循环1: 下面代码运行结果是输出10   <script> var a =[]; for(var i = 0;i<10;i++){ a[i] = function(){ consol ...