c++学习(三四二)静态库动态库

hankern hankern     2023-01-04     622

关键词:

库只是对象的集合,根据定义,这些对象尚未链接.链接器不用于创建库,因此,没有链接器选项是有道理的.

静态库不做符号链接判断

动态库做

动态库在生成时提示undefined reference to `curl_easy_init'

静态库不提示

静态库引用动态库,不要把动态库加入,在使用静态库时加入动态库

最后发现是因为我在生成静态库时把该静态库依赖的库也加上了,如下

ar -r libzlog.a format.o level.o  -lpthread

其中-lpthread是不能写在这的,这句话应该改成ar -r libzlog.a format.o level.o,最后谁用libzlog.a谁添加-lpthread

编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的 lib 中,只是简单的将编译后的中间文件打包,在编译最终的可执行项目(.exe 和 .dll)的时候,需要引用所有的库,进行符号消解。如果你需要封装,使用动态库。

静态库在编译、链接时是不需要动态库so的,也就是能生成.a静态库文件。

如果有静态库libXXX.a,它有个函数叫testFunc(),该函数用了其他的动态库的函数,比如libAA.so的AA()函数,libBB.so的BB()函数,libCC.so的CC()函数,那么,该libXXX.a对这些动态库的调用仍是动态调用,而不是把动态库的相关函数copy到自己身上。

任何其他程序,想用libXXX.a,链接时都需要链接libXXX.a所依赖的动态库。 

至于程序跑起来时,动态库是否要在现场?这个就跟编译程序加不加-static有关系了。 

如果你要写的静态库libXXX.a是完全独立的,比如里面只有一些数学运算,不依赖与其他动态库,那静态库挺好的,任何用他的程序,只需要链接时用到,程序跑起来,就不需要它在现场了!

但是,如果你要写的库,依赖很多其他的库,那你还是改写成动态库吧!否则,作为写其他程序的人,如果要用你的库,那写Makefile时,还得知道你到底依赖了什么动态库,否则编译都编译不过,多痛苦啊!!!

c++学习(三七七)makefile动态库静态库

#生成静态库libtest.a$(STATIC_TARGET):$(OBJS)   arcru$(STATIC_TARGET)$(OBJS)   ranlib$(STATIC_TARGET)#生成动态库libtest.so$(SHARE_TARGET):$(OBJS)   $(CXX)-shared-fPIC-o$(SHARE_TARGET)$(SOURCE) 查看详情

c++学习(三六七)configure动态库静态库

--enable-shared=no--enable-static=yes(静态)--enable-shared=yes --enable-static=no (动态)如果不做任何设置,则动态库与静态库同时生成例子./configureCC=amr-linu-gcc--target= 查看详情

c++学习(三八四)libtool动态库静态库(代码片段)

Libtool库可以是一个静态链接库,可以是一个动态链接库,也可以同时包含两者。$libtool--mode=linkgcc-olibcompress.lacompress.lo-rpath/tmp-lz可能翻译如下gcc-shared.libs/compress.o-lz-Wl,-soname-Wl,libcompress.so.0-o.libs/libcom 查看详情

c++学习(四九零)add_library生成动态库和静态库(代码片段)

1、静态库add_library(hello_librarySTATICsrc/hello.cpp)2、动态库注意这里是SHARED,而不是DYNAMICadd_library(hello_librarySHAREDsrc/hello.cpp) 查看详情

c++学习(四九零)add_library生成动态库和静态库(代码片段)

1、静态库add_library(hello_librarySTATICsrc/hello.cpp)2、动态库注意这里是SHARED,而不是DYNAMICadd_library(hello_librarySHAREDsrc/hello.cpp) 查看详情

小白学习c++教程二十三如何安装和使用c++标准库(代码片段)

@Author:Runsen在C++中,我们有两种类型的库:静态库动态库静态库静态库是成为引用它的可执行文件的一部分的库。因此,当我们开发应用程序并引用其中的静态库时,静态库的内容在应用程序中被替... 查看详情

c++学习(四四二)cmakeninjabuild.ninjarules.ninja

build.ninjarules.ninja由cmake生成ninja复制执行build.ninjarules.ninja1、build.ninjabuild.ninja制定参数,比如链接的动态库等。2、rules.ninjarules.ninja制定一些规则,比如编译、链接,它会包含在build.ninja中。rules还会生成rsp文件,... 查看详情

小白学习c++教程二十三如何安装和使用c++标准库(代码片段)

@Author:Runsen在C++中,我们有两种类型的库:静态库动态库静态库静态库是成为引用它的可执行文件的一部分的库。因此,当我们开发应用程序并引用其中的静态库时,静态库的内容在应用程序中被替... 查看详情

动态与静态函数库学习

前言软件之间都会互相使用彼此提供的函数库来进行特殊功能的运行。函数库依照是否被编译到程序内部而分为动态函数库与静态函数库。静态函数库特点扩展名(.a):这类函数库扩展名为libxxx.a类型。编译行为:这类函数库... 查看详情

如何从 Visual C++ 的 .obj 文件构建静态和动态库?

】如何从VisualC++的.obj文件构建静态和动态库?【英文标题】:Howtobuildstaticanddynamiclibrariesfrom.objfilesforVisualC++?【发布时间】:2015-08-0116:05:35【问题描述】:我有VisualStudio2008,Windows764位。我正在使用WinBGIm图形库。这个库提供了一... 查看详情

c++学习(四一六)androidstudio引用动态库

在项目的app/src/main目录下,创建jniLibs/armeabi(arm64-v8a)目录,将动态库拷贝到该目录下。 查看详情

Linux C++ 动态库和静态初始化顺序

】LinuxC++动态库和静态初始化顺序【英文标题】:LinuxC++DynamicLibsandstaticinitializationorder【发布时间】:2015-05-3121:35:49【问题描述】:请原谅我的长篇大论。这是一个复杂的问题,我想要一个完整的描述。在LinuxFedora21(g++4.9.2)等上。... 查看详情

c++学习(三四一)pkg-config

大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。     对于一个比较大第三方库,其头文件和库文件的数量是比较多的... 查看详情

在 gcc Linux 中将静态库链接到动态库

】在gccLinux中将静态库链接到动态库【英文标题】:linkstaticlibraryintodynamiclabraryingccLinux【发布时间】:2017-08-0911:24:19【问题描述】:我有很多在32位平台Linux下的“c++”上编写的静态库。现在我需要使用我的c++功能在64位平台Linux... 查看详情

c++学习(四九五)一个最简单的cmake工程文件(动态链接库)(代码片段)

生成的动态库为libpng.socmake_minimum_required(VERSION3.12)#----------------------------------------------------------------------------#CMakefileforlibpng.SeerootCMakeLists.txt##----------------------------- 查看详情

c++中lib和dll的区别,生成以及使用详解

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执... 查看详情

c语言学习笔记--动态库和静态库的使用

1.C语言中的链接器 (1)每个C语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接... 查看详情

如何使用 C++ 静态库编译 C# 应用程序?

】如何使用C++静态库编译C#应用程序?【英文标题】:HowtocompileC#applicationwithC++staticlibrary?【发布时间】:2009-04-0811:22:03【问题描述】:我把我的C++动态链接库变成了静态库只是为了获得更多的知识。我的问题是如何使用.obj文件... 查看详情