当前位置: 首页 > news >正文

【C++学习笔记】extern “c“以及如何查看符号表

如何查看符号表

要查看.a文件的内容,可以使用ar命令。下面是一些常见的用法:

列出.a文件中包含的所有文件:
ar t <filename.a>提取.a文件中的单个文件:
ar x <filename.a> <filename.o>将.a文件中的所有文件提取到当前目录:
ar x <filename.a>在.a文件中添加新文件:
ar r <filename.a> <filename.o>替换.a文件中的现有文件:
ar r <filename.a> <filename.o>

请注意,.a文件通常是静态库文件,包含编译后的目标文件。如果您想查看目标文件的内容,可以使用objdumpreadelf等工具

要查看.so文件的内容,你可以使用以下命令:

列出.so文件中包含的符号表:
nm -D <filename.so>列出.so文件中包含的所有函数和变量:
objdump -T <filename.so>查看.so文件中某个函数的汇编代码:
objdump -d -M intel <filename.so> | grep <function_name>查看.so文件的头部信息:
readelf -h <filename.so>

请注意,.so文件通常是共享库文件,包含已编译的可重定位目标文件。这些命令将允许查看.so文件中的各种元素,例如符号表、函数、变量和汇编代码。

nm是"Symbol table
Namer"的缩写。nm命令可以列出目标文件中定义和引用的符号,并且可以根据不同的选项以不同的格式显示这些符号信息。在Linux系统上,nm命令通常与C/C++编译器一起使用,用于查看编译后的二进制文件(例如可执行文件、静态库文件、共享库文件)中的符号表信息。

C++中使用gcc编译的C模块

https://zhuanlan.zhihu.com/p/114669161
有一个用gcc编译出来的util.o

// util.h
int add(int, int);
// util.c
int add(int a, int b)
{return a + b;
}

在C++中,如果想使用这个.o,就必须让g++编译器,以gcc的方式生成符号表,才能在用gcc编译的.o中找到对应的符号,在util.h中用extern 'C’声明一下,那么包含了这个.h.cpp文件编译时就知道用gcc的方式去生成add的符号表

// util.h
extern "C"
{int add(int, int);
}

通常情况下,如果一个模块使用gcc编译成的动/静态库给别人用的话,这个模块的.h文件一般这么写:

#ifdef __cplusplus
extern "C" {
#endifint add(int, int);#ifdef __cplusplus
}
#endif

在C中用C++的模块

https://zhuanlan.zhihu.com/p/361485807
有一个C++风格写的代码 test.htest.cpp,因为C无法直接调用Cpp风格的代码,所以增加一个接口模块,这个接口代码中调用test.cpp的功能,然后让这个接口模块以C的风格编译。

// test.h
class Test {
public:int add(int, int);
}
// test.cpp#include "test.h"
int Test::add(int, int) { ... }
// test_api.cpp
#include "robot.h"#ifdef __cplusplus
extern "C" {
#endif// 因为我们将使用C++的编译方式,用g++编译器来编译 test_api.cpp 这个文件,
// 所以在这个文件中我们可以用C++代码去定义函数 void test_api(int a, int b)(在函数中使用C++的类 Test),
// 最后我们用 extern "C" 来告诉g++编译器,不要对 test_api(int a, int b) 函数进行name mangling
// 这样最终生成的动态链接库中,函数 test_api(int a, int b) 将生成 C 编译器的符号表示。void test_api(int a, int b)
{Test t;t.add(a, b);
}#ifdef __cplusplus
}
#endif
http://www.lryc.cn/news/100997.html

相关文章:

  • 24考研数据结构-数组和特殊矩阵
  • 服务器后台运行程序
  • 大数据课程D7——hadoop的YARN
  • Rust vs Go:常用语法对比(十三)
  • 【【51单片机DA转换模块】】
  • [SQL挖掘机] - 字符串函数 - substring
  • 第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)
  • Meta-Transformer 多模态学习的统一框架
  • tinkerCAD案例:24.Tinkercad 中的自定义字体
  • list与流迭代器stream_iterator
  • 九耶:冯·诺伊曼体系
  • 探索UCI心脏病数据:利用R语言和h2o深度学习构建预测模型
  • 基于 moleculer 微服务架构的智能低代码PaaS 平台源码 可视化开发
  • xrdp登录显示白屏且红色叉
  • Docker安装 Mysql 8.x 版本
  • 【数理知识】刚体 rigid body 及刚体的运动
  • 【UE5 多人联机教程】03-创建游戏
  • 【时间序列预测 】M4
  • SpringCloud微服务实战——搭建企业级开发框架(五十三):微信小程序授权登录增加多租户可配置界面
  • Stability AI推出Stable Diffusion XL 1.0,文本到图像模型
  • B076-项目实战--宠物上下架 展示 领养 收购订单
  • 【iOS】—— 持久化
  • 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023
  • 最优化方法
  • Mongodb 多文档聚合操作处理方法二(Map-reduce 函数)
  • ant design vue j-modal 修改高度
  • spring学习笔记七
  • hw技战法整理参考
  • uniapp 全局数据(globalData)的设置,获取,更改
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例