Visual Studio 2015 link error in example for ostream output operator of value
zeroxia opened this issue · 2 comments
Hi,
I build the project using CMake with Visual Studio 2015 Update 3, but the example program has link error.
Error
LNK2019
unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl docopt::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct docopt::value const &)" (??6docopt@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV12@AEBUvalue@0@@Z) referenced in function main
docopt_example
I think this is due to the following operator<<
overload function is not exported (the example program links to the DLL)
// (In docopt_value.h)
/// Write out the contents to the ostream
std::ostream& operator<<(std::ostream&, value const&);
If I move this function declaration to docopt.h
to enable it to use the macro DOCOPT_API
, then example program is built and run successfully.
// (In docopt.h, at the end of namespace docopt)
/// Write out the contents to the ostream
DOCOPT_API std::ostream& operator<<(std::ostream&, value const&);
Are you using the symbol (and it's failing because it's not exported)? Are you linking all the parts together?
I'm not expert on shared library.
All I do is launch cmake-gui
to enable the example project and then "configure" and "generate". I suppose cmake should take care of all those setup.
I think it's clear that in the source code this operator<<
overloading function has no DOCOPT_API
with it (declared in docopt_value.h
).
So on Windows (or for Visual Studio?), I suppose by default a symbol is not exported.
The only change to fix this, as I listed in the OP, is adding DOCOPT_API
to that operator <<
function, the example project would build and run without problem.