error LNK2019: unresolved external symbol

原创 2011年08月09日 20:28:17

    Microsoft 论坛中有一贴子:地址链接 在使用*.lib文件时发生若干链接错误。

    回答者,告诉了他两步实现的方法:

    1. use a #pragma comment

        #pragma comment (lib, "Setupapi.lib")

    2. Go to Properties > Configuration Propertoes > Linker > Input > Additional Dependencies and add the Setupapi.lib library.


     我认为这样实现起来很是费劲,在程序移植的时候必须还要设置工程属性。未免繁琐。

     看了几篇关于“#prama comment的使用”,发现可以直接使用这个预处理来完成。

     #pragma comment :

     该 指令的格式:

#pragma comment( comment-type [,"commentstring"] )
        该指令将一个注释记录放入一个对象文件或可执行文件中。
        comment-type(注释类型):可以指定为五种预定义的标识符的其中一种。

commentstring是一个提供为comment-type提供附加信息的字符串,

五种预定义的标识符为:

1、compiler:

    将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略。
            如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告。
           例如:#pragma comment( compiler )

 

2、exestr:

将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中。
        当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!

 

3、lib:

    这是一个非常常用的关键字,用来将一个库文件链接到目标文件中。

    常用的lib关键字,可以帮我们连入一个库文件。
            例如: #pragma comment(lib, "user32.lib")
            该指令用来将user32.lib库文件加入到本工程中。


       4、linker:

    将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象。

    例如:
            #pragma comment(linker, "/include:__mySymbol")

    你可以在程序中设置下列链接选项  

                /DEFAULTLIB

  • /EXPORT

  • /INCLUDE

  • /MANIFESTDEPENDENCY

  • /MERGE

  • /SECTION

(1)/DEFAULTLIB:library

/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。

忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。

(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。entryname 是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME 关键字只将函数导出为序号,没有 entryname。

DATA 关键字指定导出项为数据项。客户程序中的数据项必须用 extern __declspec(dllimport) 来声明。

有三种导出定义的方法,按照建议的使用顺序依次为:

  1. 源代码中的 __declspec(dllexport)

  2. .def 文件中的 EXPORTS 语句

  3. LINK 命令中的 /EXPORT 规范

所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。如果 entryname 以其未修饰的形式指定给链接器(与其在源代码中一样),则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称,则 LINK 发出错误信息。当需要将标识符指定给链接器时,请使用 Dumpbin 工具获取该标识符的修饰名形式。

(3)/INCLUDE:symbol

/INCLUDE 选项通知链接器将指定的符号添加到符号表。

若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。

链接器通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。用该选项指定符号将通过 /OPT:REF 重写该符号的移除。

我们经常用到的是#pragma   comment(lib,"*.lib")这类的。

#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。  

和在工程设置里写上链入Ws2_32.lib的效果一样 

5、user:

    将一般的注释信息放入目标文件中,commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略。
            例如:
            #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )


看了,上面这些我们只要解决链接器的lib问题就可以了。

所以,我们在工程主头文件中,添加一行代码:#pragma comment (linker, "/DEFAULTLIB:Setupapi.lib")

这样用一行代码就解决了全部问题了!






版权声明:本文为xiaobin原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaobin_HLJ80/article/details/6673674

深入Javascript 异常(Error)视频课程

-
  • 1970年01月01日 08:00

error LNK2019 unresolved external symbol __imp__*** 的原因之一

今天遇到了一个errorLNK2019 unresolved external symbol __imp__**** 问题,在把其他原因都排除掉,仍然是有问题,最后在属性中把它的Character S...
  • gengxt2003
  • gengxt2003
  • 2011-05-04 13:29:00
  • 2347

error LNK2019: unresolved external symbol __imp__inet_ntoa@4 referenced in function

用vs2005编译udp  socket的时候,出现这个连接错误:1>Sever.obj : error LNK2019: unresolved external symbol __imp__clos...
  • lingxiu0613
  • lingxiu0613
  • 2011-07-14 16:17:51
  • 7648

初学opengl(一)第一个opengl程序及error LNK2019: unresolved external symbol的解决

操作系统:Windows 8.1; 开发环境:Visual Studio 2013 opengl的安装非常简单,很多人写博客介绍,随便找一个跟着做就差不多。 安装完成后,找了一个同学写好的工程拿来...
  • u011636440
  • u011636440
  • 2016-03-01 15:02:09
  • 1538

error LNK2019: unresolved external symbol "public: __thiscall

出现error LNK2019: unresolved external symbol "public: __thiscall 这种错误,最常见的两种原因 1. 被调用函数没有实现,如只在头文件.h...
  • u012543266
  • u012543266
  • 2013-12-20 00:56:47
  • 3545

C++ error LNK2019: "unresolved external symbol"解决方法

1>  LINK : D:\code\OpenGLTest\Debug\OpenGLTest.exe not found or not built by the last incremental li...
  • jd_19900903
  • jd_19900903
  • 2014-05-19 16:41:16
  • 6346

error LNK2019: unresolved external symbol "public 错误的出现原因.

从网上查询中发现这个问题 有很多原因,大多数 是和链接库有关. 我的程序也出现了这个错误,经过仔细检查发现,是类定义了一个函数而没有实现,也会出现这样的问题,以后切忌 切忌!! 1>main.obj ...
  • michealmeng555
  • michealmeng555
  • 2011-06-07 15:27:00
  • 8951

error LNK2019:unresolved external symbol的解决方法

我们都知道,当我们在链接程序的时候,出现了如下错误,那是代表,程序没有找到在.h文件中定义的函数的实现。 error LNK2019:unresolved external symbol   有...
  • zxj1988
  • zxj1988
  • 2013-03-06 16:33:41
  • 13412

error LNK2019: unresolved external symbol __imp_SetupDiDestroyDeviceInfoList 错误解决

今天把以前代码中取电池信息的类,加入到com工程中。 结果报了Link错误。错误如下: error LNK2019: unresolved external symbol __imp_SetupD...
  • duoluoxia
  • duoluoxia
  • 2012-05-24 10:03:11
  • 3121

Error LNK2019:Unresolved External Symbol 解决方案

参考:http://www.educity.cn/wenda/351518.html Error LNK2019:Unresolved External Symbol *** Referenced ...
  • rudy_axle
  • rudy_axle
  • 2014-12-26 18:07:06
  • 7679
收藏助手
不良信息举报
您举报文章:error LNK2019: unresolved external symbol
举报原因:
原因补充:

(最多只允许输入30个字)