值得注意的: c++动态库、静态库、弱符号__attribute__((weak))以及extern之间的关系
先说结论:
①:动态库优先级最差,如果同时有静态库和动态库,那么首先使用的是静态库函数。
②:如果只有两个或多个动态库,那么首先使用的是最开始链接的动态库函数;
③:弱符号函数在动态库中是起任何作用的
④:动态库是强函数,静态库是若符号函数,那么extern使用的就是若符号函数
下面举例说明:
Ⅰ:首先是本源文件中包含若函数,然后链接动态库的强符号函数。如下分别是源码和结论
//main.cpp
#include<stdio.h>
#define _weak __attribute__((weak)) extern "C" {
extern int test_strong(void);
_weak int test_strong(void)
{
return 1;
}
} int main()
{
int ret = test_strong();
printf("ret = %d\n",ret);
return 0;
}
1 //strong_dyn.c
2 #include<stdio.h>
3 #define STRONG_FUNC 31
4 int test_strong(void)
5 {
6 return STRONG_FUNC ;
7 }
编译运行结果:
注释:
①:动态库编译方法(不懂得可以参照这里):
gcc -fPIC strong_dyn.c -c
gcc -shared -o libStrong_dyn.so strong_dyn.o
②:动态库使用方法(不懂得可以参照这里):
gcc main.cpp libStrong_dyn.so -o app
Ⅱ:如果静态使用弱符号函数,并且外部引用那么,使用的就是强符号函数;下面是代码和结论:
//mian.cpp
#include<stdio.h>
#define _weak __attribute__((weak)) extern "C" {
extern int test_strong_static(void);
_weak int test_strong_static(void)
{
return 1;
}
} int main()
{
int ret = test_strong_static();
printf("ret = %d\n",ret);
return 0;
}
//weak_static.c
#include<stdio.h> int test_strong_static(void)
{
return 22;
}
编译运行结果:
结论:尽量不要再大型项目使用弱符号函数;使用的话尽量避开在动态库中定义强符号函数
值得注意的: c++动态库、静态库、弱符号__attribute__((weak))以及extern之间的关系的更多相关文章
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- C++基础知识之动态库静态库
一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
- Linux 动态库 静态库
什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...
- C_动态库|静态库
动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...
- CMake 添加头文件目录,链接动态、静态库(添加子文件夹)
CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...
- Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- cmake 添加头文件目录,链接动态、静态库(转载)
来源网址:http://www.cnblogs.com/binbinjx/p/5626916.html 罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目 ...
随机推荐
- Web最佳实践阅读总结(1)
介绍 最近开始刷一些书和题,此系列是介绍在读Web最佳实践的一些收获和体会. web前端发展现状 存在问题: 代码组织混乱 代码格式的问题突出 页面布局随意 网站整体性能差,没有意识到应用诸如缓存,动 ...
- JavaScript正则进阶之路——活学妙用奇淫正则表达式
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步,以学习者的身份写博客,记录点滴. 有些童鞋肯定 ...
- 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...
- Codepen 每日精选(2018-3-31)
按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 制作像素画的画板https://codepen.io/abeatrize/... 纯 css 画的晚上的风 ...
- python爬虫---表情包批量采集
代码: import requests from pyquery import PyQuery as pq # 比xpath还要灵活的html解析工具 # 定义请求 headers = { " ...
- 界面跳转+Android Studio Button事件的三种方式
今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...
- window10解决需要管理员删除文件的权限问题
1.快捷键:"win+R",输入:gpedit.msc 回车 2.依次点击:计算机配置-windows配置-安全设置-本地策略-安全选项 3.将两个管理员批准模式和管理员状态三者 ...
- Java JDK 动态代理实现和代码分析
JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...
- parseFloat的取值
<script type="text/javascript"> document.write(parseFloat("10")) document. ...
- web.xml 配置 contextConfigLocation
web.xml中classpath:和classpath*: 有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件 ...