在我们开发的一个系统中,由于动态链接其中的一个动态库时,编译时没有问题,而运行时不能进行,如果将该库静态连接时,运行却没有问题。具体什么原因,一直没有搞清楚,权且当作暂时的解决办法。
如何同时同时使用动态和静态库链接,在GCC指令参数中具体参数如下:
-Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib
具体用途解释:sqlite库静态连接,其它库动态连接。
-Wl,-Bstatic 与-Wl,-Bdynamic参数,从字面意义上可以理解,有静态和动态的意思,但是具体的真正规则在查找了GCC的原版手册上有说明。
原文:
Note - if the linker is being invoked indirectly, via a compiler driver (eg gcc
) then all the linker command line options should be prefixed by -Wl,
(or whatever is appropriate for the particular compiler driver) like this:
gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup
This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.
实际上主要针对隐式应用LINKER的参数,用“-Wl,”来标识,,“--startgroup foo.o bar.o -Wl,--endgroup”表示一组,,-Bstatic -Bdynamic 作为关键字与-WL,不可分,在GCC连接库时,默认链接是动态链接,现在用上面的指令限制在链接sqlite库时采用静态链接。
-Bstatic 还有三个写法: -dn和
-non_shared 和
-static
-Bdynamic 还有两个写法:-dy
和-call_shared
上面参数“-L/usr/local/sqlite-arm-linux/.libs ”放不放在-Wl,...之间无所谓,因为它只是提供了sqlite动静态库的位置。可以改成下面的参数形式,更直观。
-L/usr/local/sqlite-arm-linux/.libs -L/usr/local/arm/3.3.2/lib -Wl,-dn -lsqlite -Wl,-dy
-Wl,-dn 和 -Wl,-dy成对出现才能起到标题所说的作用。
关于-Wl,后面的参数还有很多,全部明白我也不能。
还有一个问题值得注意,在-Wl,后面不能有空格,否则会出错!
关于-Wl,option 说明还有一段说明
GCC命令参数的英文原文
-Wl,option
Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas.
传递参数option作为linker的一个参数,如果option包含逗号,将在逗号处分割成几个参数。
例如:
-Wl,-dn –lsqlite
-dn 开始静态链接
-lsqlite 静态链接sqlite库
静态链接完后,然后需要动态链接
-Wl,-dy
重新开始动态链接。
分享到:
相关推荐
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...
### gcc静态库与动态库生成 在嵌入式开发领域,了解如何使用gcc工具链来构建和管理静态库(`.a`文件)与动态库(`.so`文件)是非常重要的。本文将详细介绍如何通过gcc创建这两种类型的库,并讨论它们各自的用途、优...
### Linux GCC 生成动态库与静态库详解 #### 一、基本概念 1.1 **什么是库** 在软件开发领域,库是指预先编写并编译好的...以上便是关于如何在Linux环境下使用GCC生成静态库和动态库的详细介绍,希望对您有所帮助。
在Linux环境下,使用GCC(GNU Compiler Collection)生成静态库和动态库是开发过程中的常见操作。静态库和动态库在程序构建和运行时各有特点,理解它们的工作原理和创建方法对于软件开发至关重要。 首先,静态库在...
- 最后,使用`gcc`编译器链接目标文件和静态库,例如`gcc -Wall -o main main.c -L. -lmy_sort`,`-L.`指定搜索库的路径,`-lmy_sort`指定链接库名(不包括`lib`和`.a`)。 2. 动态函数库 动态链接库的扩展名通常...
### gcc常用参数详解 ...通过以上对GCC参数的详细介绍,我们可以更好地理解如何使用GCC来进行高效的编译和链接工作。无论是对于初学者还是高级用户来说,掌握这些参数都能极大地提高开发效率和代码质量。
例如,使用`libhello.a`静态库,可以使用`gcc`命令进行编译和链接,但需要指定`-lhello`来指示链接器链接`hello`库。如果库不在默认路径下,还需要使用`-L`参数指定库的路径。 动态库的使用更为常见,因为它们可以...
同时,在编译命令中使用`-L`指定库目录,例如:`gcc -o test test.c -L/home/lib -ltest`。 对于头文件,如果不在`/usr/include`下,使用`-I`选项指定头文件路径,如:`gcc -o test test.c -L/home/lib -I/home/...
### Linux静态库与动态库详解 #### 基本概念 ...总之,无论是静态库还是动态库,它们都是Linux系统中不可或缺的一部分,深刻理解它们的生成、使用和管理机制对于提高软件开发效率和系统性能具有重要意义。
当我们想要在其他程序中使用静态链接库时,可以通过指定 `-L` 参数和 `-l` 参数来告诉编译器去哪里查找链接库文件。 ```shell gcc -o main main.c -L. -lmyhello ``` 在这个命令中,`-L.` 指定了链接库所在的目录...
- 使用GCC链接静态库生成可执行文件`main-static`。 4. **创建动态库** - 使用GCC的`-fPIC`选项编译`prime.c`生成位置无关的代码,以便在动态链接时能够被正确加载。 - 使用`gcc`的`-shared`选项生成共享库`...
如果要同时编译动态库和静态库,只需运行不带`link`和`runtime-link`选项的`b2`命令即可。 安装完成后,别忘了更新你的编译器链接路径,这样其他程序就可以找到新编译的库: ```bash echo 'export LD_LIBRARY_PATH...
这里,`no-shared` 参数表示不构建动态库,`--prefix=/usr/local/openssl` 指定了安装路径,而 `static` 参数则告诉配置脚本我们要创建静态库。 4. 编译与安装: 使用 `make` 命令编译源码,然后用 `make install...
本文将详细介绍如何创建Linux静态库和动态库,并讲解如何在程序中使用这些库。 #### 二、静态库的创建与使用 ##### 2.1 创建静态库 静态库文件通常以`.a`作为扩展名,例如`liblujiajun.a`。创建静态库的基本步骤...
使用静态库时,需要在GCC编译器中指定头文件路径(通过`-I`参数)、库文件路径(通过`-L`参数)以及库文件名(通过`-l`参数,去掉`lib`前缀和`.a`后缀)。 **2. 编写最简单的静态库文件** 假设我们需要创建一个...
这包括了如何指定头文件和库文件的位置、如何链接静态库和动态库以及如何利用各种GCC选项来优化链接过程。掌握了这些知识之后,开发者就能够更加高效地利用现有的库资源来开发自己的应用程序了。
-static 选项强制使用静态链接库,-shared 选项编译动态库。-fPIC 选项表示编译为位置独立的代码,用于编译共享库。 代码优化级别参数 –O(大写) 代码优化级别参数用于指定编译器的优化级别。-O 选项可以告诉 ...
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...