WDK assembly boost lib link warning ("LNK4217: locally defined symbol _ imported into function _")

I am building the below sample user mode application with WDK, but I am getting the following errors when linking to the boost libraries I created earlier using bootstrap and. \ bjam, from the same terminal window.

IIUC, MSDN says this because a (disgustingly mangled) function that appears to be a C ++ std lib function is marked as a DLL import, but I have a local definition. How did this happen? Is there a way to get around this?

See also: a vague question .

C:\exp>more exp.cpp
#pragma warning(disable: 4512)
#include <boost/program_options.hpp>
int __cdecl main() {
  boost::program_options::options_description desc("Allowed options");
  return 0;
}

C:\exp>more sources
TARGETNAME=exp
TARGETTYPE=PROGRAM

USE_MSVCRT=1
USE_STL=1
USE_NATIVE_EH=1

MSC_WARNING_LEVEL=/W4 /WX

_NT_TARGET_VERSION= $(_NT_TARGET_VERSION_WINXP)

INCLUDES=..\boost_1_40_0

SOURCES=exp.cpp

UMTYPE=console
UMBASE=0x400000

TARGETLIBS = $(SDK_LIB_PATH)\ws2_32.lib ..\boost_1_40_0\stage\lib\libboost_program_options-vc100-mt.lib

C:\exp>build
BUILD: Compile and Link for x86
BUILD: Loading c:\winddk\7600.16385.0\build.dat...
BUILD: Computing Include file dependencies:
BUILD: Start time: Wed Oct 14 17:34:23 2009
BUILD: Examining c:\exp directory for files to compile.
   c:\exp
Invalidating OACR warning log for 'root:x86chk'
BUILD: Saving c:\winddk\7600.16385.0\build.dat...
BUILD: Compiling and Linking c:\exp directory
Configuring OACR for 'root:x86chk' - <OACR on>
_NT_TARGET_VERSION SET TO WINXP
Linking Executable - objchk_win7_x86\i386\exp.exe
1>errors in directory c:\exp
1>link : error LNK1218: warning treated as error; no output file generated
BUILD: Finish time: Wed Oct 14 17:34:44 2009
BUILD: Done

   1 executable built - 1 Warning - 1 Error

C:\exp>more *wrn
1>warnings in directory c:\exp
1>c:\exp\libboost_program_options-vc100-mt.lib(options_description.obj): warning LNK4217: locally defined symbol ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ (public: virtual __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::~basic_streambuf<char,struct std::char_traits<char> >(void)) imported in function "public: virtual __thiscall std::basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ)

      

+2


source to share


1 answer


You explicitly include .. \ boost_1_40_0 \ stage \ lib \ libboost_program_options-vc100-mt.lib in the link.



You have to let force auto_link stuff configure to do the correct #pragma comment (lib, ...) stuff to make sure you are in the correct library and set the linker search path correctly. Chances are the boost library and your code are bundled with different runtime libraries.

+1


source







All Articles