Linux C++ 动态链接库 类的构造函数 找不到符号

时间:2021-01-07 15:48:38
我在Linux上用c++编写so的时候,发现只要写了类的构造函数,符号表里面构造函数就是U的状态,链接的时候也提示找不到符号。
其他的函数,变量,静态的,非静态的都没有问题。
网上搜索,发现别人举的例子里面有构造函数,所以应该不是本身不支持的问题。

不知道有没有人遇到过这种情况?怎么解决呢?

15 个解决方案

#1


还是没有人回答
表示不忍看下去

#2


为神马,private了?

#3


是public的,我实在找不到原因。只要把构造函数去掉,链接就成功,加上,链接就失败

#4


上代码吧,  构造实现了没有?

#5


不了解,上代码看看。

#6


上代码

#7


说的不详细啊。。。 无从下手

#8


帮顶~

#9


不懂。。帮顶~

#10


代码来了:

so中的入口文件,main.cpp:

#include "include/main.h"
#include "include/GlobalGameObj.h"

GlobalGameObj gameObj;

extern "C" int DllMain(int thread_id, char *buf, int *p_len)
{
  return 0;
}

extern "C" int DllInit(char *p_config_file, int thread_id)
{
  return 0;
}

extern "C" void DllExit(int thread_id)
{
}


头文件,main.h

#ifndef _MAIN_H_
#define _MAIN_H_

extern "C"
{
  int DllMain(int thread_id, char *buf, int *p_len);
  int DllInit(char *p_config_file, int thread_id);
  int DllInit(char *p_config_file, int thread_id);
}

#endif


GlobalGameObj的头文件,GlobalGameObj.h:

#ifndef _GLOBAL_GAME_OBJ_H_
#define _GLOBAL_GAME_OBJ_H_

class GlobalGameObj
{
public:
  GlobalGameObj();
  void Init(char *config_file, int thread_id);
};

#endif
}


GlobalGameObj的源文件,GlobalGameObj.cpp

#include "include/GlobalGameObj.h"

GlobaGameObj::GlobalGameObj()
{
}

void GlobaGameObj::Init(char *config_file, int thread_id)
{
}


首先用下面的编译:
g++ -fPIC -I../main -o ../build/main_main.o -c main.cpp
得到了main_main.o
然后用下面的编译:
g++ -shared -o libGameLogic.so main_main.o
得到了libGameLogic.so

这个时候执行nm libGameLogic.so,就可以看到构造函数的状态是U

如果用下面的测试文件,test.cpp:

#include "main/include/main.h"

int main()
{
  DllInit(0, 0);
}


用下面的编译和连接:
g++ test.cpp -L. -lGameLogic -o test.o
就会报错:
./libGameLogic.so: undefined reference to `GlobalGameObj::GlobalGameObj()'
collect2: ld returned 1 exit status

如果我去掉了GlobalGameObj的构造函数,就没有问题,可以正确链接成功。
求助!!



#11


自己顶一下

#12


我没见你制作GlobalGameObj.so啊。

are you joking?

#13


我自己已经试验了一下:你应该如下编译过程:

g++ -fPIC -I../main -o ../build/main_main.o -c main.cpp
g++ -fPIC -I../main -o ../build/GlobalGameObj.o -c GlobalGameObj.cpp
g++ -shared -o libGameLogic.so main_main.o GlobalGameObj.o
g++ test.cpp -L. -lGameLogic -o test

#14


另外,执行test程序前export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

#15


哦,我知道了,我的makefile文件有问题,目录下面每个cpp都有规则,但是少了总的规则来编译他们,导致每次只生成第一个cpp的o文件。谢谢!

#1


还是没有人回答
表示不忍看下去

#2


为神马,private了?

#3


是public的,我实在找不到原因。只要把构造函数去掉,链接就成功,加上,链接就失败

#4


上代码吧,  构造实现了没有?

#5


不了解,上代码看看。

#6


上代码

#7


说的不详细啊。。。 无从下手

#8


帮顶~

#9


不懂。。帮顶~

#10


代码来了:

so中的入口文件,main.cpp:

#include "include/main.h"
#include "include/GlobalGameObj.h"

GlobalGameObj gameObj;

extern "C" int DllMain(int thread_id, char *buf, int *p_len)
{
  return 0;
}

extern "C" int DllInit(char *p_config_file, int thread_id)
{
  return 0;
}

extern "C" void DllExit(int thread_id)
{
}


头文件,main.h

#ifndef _MAIN_H_
#define _MAIN_H_

extern "C"
{
  int DllMain(int thread_id, char *buf, int *p_len);
  int DllInit(char *p_config_file, int thread_id);
  int DllInit(char *p_config_file, int thread_id);
}

#endif


GlobalGameObj的头文件,GlobalGameObj.h:

#ifndef _GLOBAL_GAME_OBJ_H_
#define _GLOBAL_GAME_OBJ_H_

class GlobalGameObj
{
public:
  GlobalGameObj();
  void Init(char *config_file, int thread_id);
};

#endif
}


GlobalGameObj的源文件,GlobalGameObj.cpp

#include "include/GlobalGameObj.h"

GlobaGameObj::GlobalGameObj()
{
}

void GlobaGameObj::Init(char *config_file, int thread_id)
{
}


首先用下面的编译:
g++ -fPIC -I../main -o ../build/main_main.o -c main.cpp
得到了main_main.o
然后用下面的编译:
g++ -shared -o libGameLogic.so main_main.o
得到了libGameLogic.so

这个时候执行nm libGameLogic.so,就可以看到构造函数的状态是U

如果用下面的测试文件,test.cpp:

#include "main/include/main.h"

int main()
{
  DllInit(0, 0);
}


用下面的编译和连接:
g++ test.cpp -L. -lGameLogic -o test.o
就会报错:
./libGameLogic.so: undefined reference to `GlobalGameObj::GlobalGameObj()'
collect2: ld returned 1 exit status

如果我去掉了GlobalGameObj的构造函数,就没有问题,可以正确链接成功。
求助!!



#11


自己顶一下

#12


我没见你制作GlobalGameObj.so啊。

are you joking?

#13


我自己已经试验了一下:你应该如下编译过程:

g++ -fPIC -I../main -o ../build/main_main.o -c main.cpp
g++ -fPIC -I../main -o ../build/GlobalGameObj.o -c GlobalGameObj.cpp
g++ -shared -o libGameLogic.so main_main.o GlobalGameObj.o
g++ test.cpp -L. -lGameLogic -o test

#14


另外,执行test程序前export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

#15


哦,我知道了,我的makefile文件有问题,目录下面每个cpp都有规则,但是少了总的规则来编译他们,导致每次只生成第一个cpp的o文件。谢谢!