动态库、静态库、弱符号__attribute__((weak))与extern间有何关联?

2026-05-25 07:212阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计593个文字,预计阅读时间需要3分钟。

动态库、静态库、弱符号__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

动态库、静态库、弱符号__attribute__((weak))与extern间有何关联?

Ⅱ:如果静态使用弱符号函数,并且外部引用那么,使用的就是强符号函数;下面是代码和结论:

//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; }

编译运行结果:

结论:尽量不要再大型项目使用弱符号函数;使用的话尽量避开在动态库中定义强符号函数

本文共计593个文字,预计阅读时间需要3分钟。

动态库、静态库、弱符号__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

动态库、静态库、弱符号__attribute__((weak))与extern间有何关联?

Ⅱ:如果静态使用弱符号函数,并且外部引用那么,使用的就是强符号函数;下面是代码和结论:

//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; }

编译运行结果:

结论:尽量不要再大型项目使用弱符号函数;使用的话尽量避开在动态库中定义强符号函数