这个问题搞了我 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. jstree设置checkbox单选

    jstree设置插件checkbox只允许单选 jstree version console.log($.jstree.version); 3.3.8 单选配置参数: $.jstree.default ...

  2. 【JZOJ5093】【GDSOI2017第四轮模拟day3】字符串匹配 哈希

    题面 对于一个字符集大小为C的字符串P,我们可以将任意两种字符在P中的位置进行互换,例如P=abcba,我们交换a,b就变为bacab,交换a,d就变为dbcbd,交换可以进行任意次.若交换后P变为了 ...

  3. poj2449第K短路问题(A*算法)

    启发函数:f(x)=g(x)+h(x); g(x)表示初始点到x状态的代价,h(x)表示从x的状态到目标状态的代价的估计值(并不是真实的),实际最小代价<=h(x); 起点s,终点t,x.v=s ...

  4. 【风马一族_php】NO4_php基础知识

    原文来自:http://www.cnblogs.com/sows/p/6017018.html(博客园的)风马一族 侵犯版本,后果自负 回顾 运算符:算术运算符.逻辑运算符.比较运算符.位运算符.赋值 ...

  5. 好玩又实用,阿里巴巴开源混沌工程工具 ChaosBlade

    减少故障的最好方法就是让问题经常性的发生.在可控范围或环境下,通过不断重复失败过程,持续提升系统的容错和弹性能力. 那么,实施一次高效的混沌工程实验,需要几步呢? 答案:2 步. ① 登陆 Chaos ...

  6. Vagrant-安装教程及常见问题

    http://ju.outofmemory.cn/entry/346215 前言: Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 它的主要意义是让所有开发人员都使用和线上服务 ...

  7. Oracle使用——impdp导入数据时数据表已经存在

    背景 在做数据迁移时,需要将不同地方的dmp文件整合到一个数据库中,在导入时,目标表已经存在,该如何把数据追加进入目标表中 方法介绍 当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提 ...

  8. 【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走

    题目描述 数据范围 对于70%的数据保证 n <= 1000 对于100%的数据保证 n,q <= 10^5,c_i,v_i <= 10^{18} 保证每次修改后的边权小于等于原来的 ...

  9. Python3 写的远程批量修改文件内容的脚本

    一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...

  10. Java数据类型分析

    Java的简单数据讲解列表如下: int:int为整数类型,存储的时候,用4个字节存储,范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0.   ...