值得注意的: 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. 添加头文件目 ...
随机推荐
- java中如何能知道应该捕获什么样的异常?举例
我怎么知道应该捕获什么样的异常? 马克-to-win:如上例1.1:开始没加try时,程序崩溃,系统打印的是如下的错误,Exception in thread "main" jav ...
- CSS简单样式练习(一)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- js多线程worker
参考地址:https://blog.csdn.net/huang100qi/article/details/89303555?utm_source=app https://www.cnblogs.co ...
- 在node中通过cors跨域。
cors : 全称 cross origin resource share 跨资源共享 在nodejs 中可以通过在服务器端设置代码如下实现cors跨域 res.setHeader('Access- ...
- Ncrystal Skill设计
在使用allegro时一般都会听说过skill,使用合适的Skill会使事情事半功倍.但是现阶段所能看到的个人白嫖的Skill都有一些通病.所以我才开发符合自己操作习惯的Skill. 当前我们所能找的 ...
- Java中List接口重要实现类一ArrayList
1.java.util.ArrayList 集合数据存储的结构是数组结构.元素查找快,而增删就比较慢 所以如果要查询数据,遍历数据,ArrayList是最常用的集合 2.ArrayList是不同步的, ...
- 解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法
1,打开 /e/search/result/index.php 文件 查找 require("../../class/connect.php"); require(".. ...
- HTML中的Hack手段之条件注释
通常WEB的好处就是可以跨平台,但这个世界偏偏有个另类,就是IE浏览器.在平常做HTML设计时,有时需要为IE的表示差异而不得不使用一些Hack手段.条件注释就是这类手段之一. 条件注释是IE浏览器的 ...
- 我们必须要了解的Java位运算(不仅限于Java)
本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...
- javaScript中Math内置对象基本方法入门
概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...