动态链接库不是 C++标准,是不同操作系统的实现。
我测试了一下,在 Linux 下不能导出自定义的类型为全局变量。没有你说的阻塞的情况,应该就是没有生成这个变量导致。
楼上说的对, 反对使用全局变量。
```
#include <thread>
#include <cstdio>
extern "C"
{
class TestClass
{
public:
TestClass()
{
printf("construct TestClass\n");
m_thread = std::thread([] {});
}
~TestClass()
{
printf("destruct TestClass\n");
if (m_thread.joinable())
{
m_thread.join();
}
}
protected:
private:
std::thread m_thread;
};
extern TestClass tc;
extern int go =1002;
extern struct my m;
struct my{
int a;
int b;
};
}
//g++ --std=c++11 -fPIC -shared dynamic.cpp -o
libdy.so```
从符号表上看只有 int go 被导出了
```
nm -D
libdy.so 0000000000201024 B __bss_start
w __cxa_finalize
0000000000201024 D _edata
0000000000201028 B _end
00000000000005c0 T _fini
w __gmon_start__
0000000000201020 D go
0000000000000480 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
```
调用的代码
```
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main()
{
void *handle = dlopen("./
libdy.so", RTLD_NOW);
if (!handle)
{
printf("%s\n", dlerror());
exit(-1);
}
{
void *ptr = nullptr;
ptr = dlsym(handle, "tc");
if (ptr == nullptr)
{
printf("tc is null\n");
printf("%s\n", dlerror());
}
else
{
printf("find tc\n");
}
}
{
void *gp = nullptr;
gp = dlsym(handle, "go");
if (!gp)
{
printf("tc is null\n");
printf("%s\n", dlerror());
}
else
{
printf("go is %d\n", *((int *)gp));
}
}
{
void *ptr = nullptr;
ptr = dlsym(handle, "m");
if (ptr == nullptr)
{
printf("m is null\n");
printf("%s\n", dlerror());
}
else
{
printf("find m\n");
}
}
dlclose(handle);
return 0;
}
//g++ -std=c++11 -rdynamic call_dynamic.cpp -o call_dynamic -ldl
```