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]][,DA<wbr>TA]</wbr>
使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。entryname 是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME 关键字只将函数导出为序号,没有 entryname。
DA<wbr>TA 关键字指定导出项为数据项。客户程序中的数据项必须用 extern __declspec(dllimp<wbr>ort) 来声明。</wbr></wbr>
有三种导出定义的方法,按照建议的使用顺序依次为:
-
源代码中的 __declspec(dllexport)
-
.def 文件中的 EXPORTS 语句
-
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")!
这样用一行代码就解决了全部问题了!
分享到:
相关推荐
解决error LNK2001: unresolved external symbol
解决报错Error LNK2001:unresolved external symbol
visual c++报error LNK2001 unresolved external symbol错就是因为你...
unresolved external symbol,multiply defined symbols found 这是一个困扰C语言新手的问题 #include没毛病 但是用多了就出毛病 看代码,哪都没毛病 在B中#include A 在A中#include B 此时build就会报unresolved ...
error LNK2001 unresolved external symbol _GetObjectContext.zip
当用evc编写atl客户端程序时,会有 error LNK2019: unresolved external symbol "void __cdecl _com_issue_error(long)" (?_com_issue_error@@YAXJ@Z) referenced in function "public: __thiscall _variant_t::_...
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crt
Printer.obj : error LNK2019: unresolved external symbol "protected: __thiscall Counted<class Printer>::Counted(void)" ([email=??0?$Counted@VPrinter@@@@IAE@XZ]??0?$Counted@VPrinter@@@@IAE@XZ[/email]) ...
博文的配套源码 《【 Visual C++】游戏开发笔记之二——最简单的directx,vc窗口的编写 》 ,原文地址为... 源码编译环境为vs2010. ... 希望能和大家一起交流,共同学习,共同进步。
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crtexew.obj) : error LNK2001: ...
博文的配套源码 《 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍&第一个DirectX 11 Demo的创建》 ... ... 此为VS2010版,若没有安装VS2010以上版本的朋友,请用记事本打开,main.cpp文件并复制里面的代码,...
player.obj : error LNK2001: unresolved external symbol _IID_IVideoWindow player.obj : error LNK2001: unresolved external symbol _IID_IMediaControl 这是因为链接器没有找到合适的.lib文件。两种办法: ...
nafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_endthreadex nafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_beginthreadex Debug/MyMFC.exe:fatal error LNK1120:2 ...
(1)error LNK2001: unresolved external symbol _main 编号:LNK2001 直译:未解决的外部符号:_main。 错误分析:缺少main函数。看看main的拼写或大小写是否正确。 (2)error LNK2005: _main already defined in ...
有具体的help说明,并有vs2005/vs2008/vs2010添加.lib文件的方法以及vc2005出错解决方法error LNK2019: unresolved external symbol __imp____glutInitWithExit@12 referenced in function _glutInit_ATEXIT_HACK@8
5、beep.def : error LNK2001: unresolved external symbol BEP_Close 6、'VirtualCopy': identifier not found, even with argument-dependent lookup 7、NMAKE : U1073: don't know how to make 'ser24402.def' ...
common.obj : error LNK2019: unresolved external symbol TA_Initialize referenced in function __pyx_pf_5talib_6common_2_ta_initialize 这个问题有点高级,看起来说是链接错误,很多人到这就不知道怎么办了,...
本文实例讲述了VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法。分享给大家供大家参考。具体如下: 在创建MFC项目时, 不使用MFC...LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _Wi
vs2013环境下, 编译报error LNK2001: unresolved external symbol "class ATL::CAtlBaseModule ATL::_AtlBaseModule",由于缺少atlsd.lib库。
libjpeg.lib(jerror.obj) : error LNK2019: unresolved external symbol __iob referenced in function _output_message //该错误主要是由于静态库在VC6编译而主程序在VC2005编译,大家用的CRT不同。解决办法,代码...