docopt / docopt.cpp

C++11 port of docopt
Boost Software License 1.0
1.04k stars 146 forks source link

Visual Studio 2015 link error in example for ostream output operator of value #139

Open zeroxia opened 3 years ago

zeroxia commented 3 years ago

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&);
jaredgrubb commented 3 years ago

Are you using the symbol (and it's failing because it's not exported)? Are you linking all the parts together?

zeroxia commented 3 years ago

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.