OpenVPN is a giant header only 'library'. I created a library based on it, which consists of a MyClass.h
file that has a class MyClass
that uses the headers from OpenVPN. I compile this library as libmy
.
The problem is that when I try to use libmy
in another project, I'm forced to include MyClass.h
, which in turn includes all of the OpenVPN headers. I don't need them, since MyClass
hides all OpenVPN-related things. However, since OpenVPN headers have some static variables like static int context_data_index
(defined AND declared in header, here), these variables get duplicate definitions when I try to compile my new project.
Let me explain the problem better. This is MyClass.h
:
class MyClass {
public:
//lots of 'methods' that hide OpenVPN-related things. Users of these methods dont even know about OpenVPN
private:
//Users of MyClass do not need to know about this unique_ptr, but I'm forced to show it in `MyClass.h`, which is why I get duplicated definitions
#ifndef DO_NOT_INCLUDE_OPENVPN_HEADERS
std::unique_ptr<OpenVPNClient> openVpnClient;
#endif
}
as you can see, the users of MyClass
don't have to know anything about OpenVPN objects. I even tried to put an #ifndef
clause that conditionally includes std::unique_ptr<OpenVPNClient> openVpnClient;
when compiling libmy
but does not include when compiling the library that uses libmy
, but I got terrible undefined behaviour by doing that. I guess it's because a class must have the same number of objects with the same objects in both the libmy
implementation and in my new library.
What can I do about this problem?