docopt/docopt.cpp

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.