首页 > 解决方案 > 用于从共享库中导出类的头文件

问题描述

我已经构建了一个包含多个类的共享库(.so)。我现在需要创建用于将这些类导入另一个应用程序的头文件。一些导出的类具有私有数据/功能。这些是否需要包含在该头文件中?

例如:

orig.h(用于构建库的标头)

#ifndef __MYLIB__
#define __MYLIB__

// system includes here

#ifdef __cplusplus
extern "C" {
#endif

namespace myspace{
// my includes
#include "..."

#ifndef EXPORT_API
#define EXPORT_API   __attribute__((__visability__("default")))
#endif

class EXPORT_API MyClass1 {
public:
   MyClass1();
   virtual ~MyClass1();

public:
    ...        // public members 

protected:
   ...        // protected members

private:     // private members
   ...       // these should not be visible outside of the lib


};
} //namespace
#ifdef __cplusplus
}
#endif
#endif  // __MYLIB__

这构建好了。

lib用户用来构建他们的应用程序的exp.h

#ifndef __MYLIB__
#define __MYLIB__

// system includes here

#ifdef __cplusplus
extern "C" {
#endif

namespace myspace{

class  MyClass1 {
public:
   MyClass1();
   virtual ~MyClass1();

public:
    ...        // public members 

protected:
   ...        // protected members

// no private members listed here.

};
} //namespace
#ifdef __cplusplus
}
#endif
#endif //__MYLIB__

在我的 userapp.h 中:

#ifndef __MYUSER__
#endif
#include <...> //system includes

#ifdef __cplusplus
extern "C" {
#endif

#include "exp.h"

//derived class
class MyClass2 : public MyClass1 {
public:
   MyClass2();
   ~virtual MyClass2();

public:
  // derived class members
  myclass2_func();

  int   m_myclass2int;
};

在 main.cpp 中:#include "userapp.h"

using myspace;
int main(int *argc, char** argv){

MyClass2   theClass;

// make member calls to theClass
theClass.myclass2_func();
theClass.m_myclass2int = 0;

return 0;
}

这也很好。

但是当我调试 userapp 时,内存被破坏了,很可能是由于错误的指针。这通常是当我单步执行派生类函数(例如 myclass2_func)时,我会遇到分段错误(内存访问冲突),或者有时 gdb 本身会崩溃(尝试显示值时)。我猜这与我没有在 exp.h 中指定的 lib 中的私有部分有关。

那么回到最初的问题:这些私有部分是否需要包含在导入头文件中?

TIA

标签: c++exportshared-librariesheader-files

解决方案


推荐阅读