user-0 提问: 关于nm命令（C调用C++的SO动态链接库）

回复:
user: user-0
content: 引用 10 楼 bluesky12312388 的回复:已经测试通过:  t.cpp: #include <stdio.h>  int PP(int a, int b) {         printf("a:%d b:%d\n",a ,b);         return 0; } g++ -g -Wall -fPIC -shared -o libt.so t.cpp  m.c  #include <stdio.h>  extern "C++" int PP(int a,int b);  int main(int argc, const char *argv[]) {         int a = 10;         int b = 20;         PP(a,b);         return 0; }  g++ -g -Wall -o m m.c -L./ -lt export LD_LIBRARY_PATH=当前的目录 ./m 结果 a:10 b:20  以上方法确实是可以的，谢谢你。但是我同时希望将m.c也生成so的，应该用什么命令组合呢。我实验用以下方式，但没成功。 gcc -fPIC -shared m.c -L. -lt -o libm.so

user: user-1
content: 已经测试通过:  t.cpp: #include <stdio.h>  int PP(int a, int b) {         printf("a:%d b:%d\n",a ,b);         return 0; } g++ -g -Wall -fPIC -shared -o libt.so t.cpp  m.c  #include <stdio.h>  extern "C++" int PP(int a,int b);  int main(int argc, const char *argv[]) {         int a = 10;         int b = 20;         PP(a,b);         return 0; }  g++ -g -Wall -o m m.c -L./ -lt export LD_LIBRARY_PATH=当前的目录 ./m 结果 a:10 b:20

user: user-0
content: 这个感觉很简单，就是不知道那地方有问题

user: user-0
content: 这个感觉很简单，就是不知道那地方有问题

user: user-0
content: 10楼没问题大家请参考，18点前接贴  但是 g++ m.c -fPIC -shared -L. -lt -o libm.so 用这种方式我对m.c这个中间层进行了二次封装生成SO。 但是c语言调用这个中间层的函数还是类似   _Z13_XXXX_XXXX 原函数名这种方式。

user: user-2
content: extern "C" 修饰你的封装函数...

user: user-3
content: 学习学习，回去研究下

user: user-0
content: g++ m.c -fPIC -shared -L. -lt -o libm.so 用这种方式我对m.c这个中间层进行了二次封装生成SO。 但是c语言调用这个中间层的函数还是需要_Z13_原函数名这种方式。

user: user-0
content: 引用 6 楼 lm_whales 的回复:_InitLGMID的 _ 是C语言的 C调用约定，C生成的函数名就是这样的 InitLGMID就可以了 ，_ 是多余的  我实验了，不行的。

user: user-4
content: _InitLGMID的 _ 是C语言的 C调用约定，C生成的函数名就是这样的 InitLGMID就可以了 ，_ 是多余的

user: user-0
content: 完整例子：  nm命令C++生成的SO：  nm -DC libLGM.so |grep "LGMID"   // 这个也是真实的函数名，但Test.c调用它的时候说找不到 000000000005ec80 T _InitLGMID(char const*, FRMode)  //实际Test.c必须调用它才行， 000000000005ec80 T _Z13_InitLGMIDPKc6WCMode         _InitLGMID(char const*, enum WCMode)是对方提供给我们的libLGM.so调用接口（通过Test.c调用它，说找不到） _Z13_InitLGMIDPKc6WCMode(char const*, enum WCMode); 是我通过nm命令获取到的（通过Test.c调用它，没有问题）  我还是想通过_InitLGMID这种好理解的接口方式调用，可能是我以下哪里写的不对，请各位帮忙了。 ---------------------- Test.h文件  #include <stdio.h>  enum WCMode {DB, TXT};   /* #ifdef __cplusplus extern "C" { #endif */  int callFreeLGMID(int);   int _Z13_InitLGMIDPKc6WCMode(char const*, enum WCMode); //这么写就可以    int _InitLGMID(char const*, enum WCMode);  //这么写就说_InitLGMID没有发现   /* #ifdef __cplusplus } #endif */ -------------------------------------------- Test.c #include <stdio.h> #include "Test.h"  int main(void) {     printf("Hello World!\n");     return 0; }  int callFreeLGMID(int task){	     int init = _Z13_InitLGMIDPKc6WCMode("./INFO",TXT);//这么写就可以    //int init = _InitLGMID("./INFO",TXT);//这么写就说_InitLGMID没有发现   printf("open :%d\n",init);        return 9;  }

user: user-0
content: 引用 3 楼 user-5 的回复:第三方提供的so是c++编译的。 你试试也用c++编译（把.c改为.cpp），最好编译器也一致。 不行

user: user-5
content: 第三方提供的so是c++编译的。 你试试也用c++编译（把.c改为.cpp），最好编译器也一致。

user: user-0
content: 引用 1 楼 bluesky12312388 的回复:具体可以google c++ name mangling 你想直接在test.c调用 so中的UNTHDBID也是可以的， 把这个函数用"extern c++"声明下， 我进行了如下的定义，还是不行。 #include <stdio.h>  enum LGMode {TXT, DB};   #ifdef __cplusplus extern "C" { #endif   int UNTHDBID(enum LGMode);  #ifdef __cplusplus } #endif

user: user-1
content: 具体可以google c++ name mangling 你想直接在test.c调用 so中的UNTHDBID也是可以的， 把这个函数用"extern c++"声明下，