Search code examples
c++cname-mangling

Wrapping a C lib with extern "C" except an internal C++ include


I have a C library that I need to use in a C++ code, so I need to wrap the whole lib with an extern "C" block. The problem is that the library seems to include a C++ compiled code, so wrapping the whole lib would also wrap that C++ header.

includes

Inside lib.h I only include all the internal headers I want to expose, something like this:

#ifndef LIB_H
#define LIB_H

#include "lib_foo.h"
#include "lib_bar.h"
#include "lib_baz.h"

#endif

So the client will only need to include lib.h to use the lib.

In my first attempt I've done this:

#ifndef LIB_H
#define LIB_H

extern "C" {
  #include "lib_foo.h"
  #include "lib_bar.h"
  #include "lib_baz.h"
}

#endif

But then I get a symbol lookup error when I execute any function inside already_compiled_c++.h.

How can I avoid from applying extern "C" in the already_compiled_c++.h header file?


Edit:

Solved. This was not a problem using extern "C", it was a problem linking the compiled c++ library with gyp correctly: Using shared library in Gyp in node-sqlite3


Solution

  • Note that extern C isn't legal C, so it must only be included hen compiling as C++.

    The already_compiled_c++.h header probably contains a guard against multiple includes, so just include it first:

    #ifndef LIB_H
    #define LIB_H
    
    # This include added so that it won't get marked extern "C" when included by lob_foo.h.
    #include <already_compiled_c++.h>
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
      #include "lib_foo.h"
      #include "lib_bar.h"
      #include "lib_baz.h"
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    Note: You need to check if already_compiled_c++.h is conditionally included and add the corresponding conditionals.