Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zeroxia opened this issue Feb 25, 2021 · 2 comments

Comments

@zeroxia
Copy link

zeroxia commented Feb 25, 2021

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
Copy link
Member

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

@zeroxia
Copy link
Author

zeroxia commented Feb 26, 2021

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants