动态库

Linux C/C++编译过程中的各种not declared in this scope

不羁岁月 提交于 2019-12-03 17:05:43
Linux C/C++编译时经常会"XXX was not declared in this scope" 原因可能是以下几种: 变量名或函数名写错了; 忘记定义了 没有成功链接到静态库或动态库; include头文件时出现了错误 以往经验: 1.有时变量名写错时,明知道位置也看不出的时候也不在少数; 原因有可能是大小写不一致,拼写的前后顺序不对等; 2.有多个文件的时候最好写makefile,直接用g++命令有可能会漏掉".c或.cpp"文件,导致出现问题。 3.找不到动态库或静态库,或者是静态库和动态库与头文件不匹配。 4.唯一一次遇到这个问题是集成json的时候,在include时,不论-I到哪个目录,直接写#include <json.h>都不行,写#include <json/json.h>就可以。 来源: https://www.cnblogs.com/bugutian/p/11804043.html

静态库.a 的编译和使用过程

℡╲_俬逩灬. 提交于 2019-12-03 11:06:35
了解 许多时在项目中,往往对于积累沉垫下来很少改动的代码(高内聚,低耦合的代码),为了增加重用性,常常都进行库的封装好存。 在WIN上封装为DLL(动),LIB(静)。在LINUX上封装为.SO(动),.a(静)。 IOS中静态库的方式有*.a或*.framework。不论是.a还是.framework其实无外于对源码进行隐藏的一种表现方式 objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,   objc上的库一般分为两类     静态库: .a 和 .framework       .a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容       .framework文件:包含二进制文件       链接时,静态库会被完整地复制到可执行文件中,例如iOS程序打包的时候会包含所有引用的静态库     动态库: .dylib 和 .framework        iOS项目不支持动态库,每个APP都是独立运行的,并且不能直接互相访问,APP只能访问系统自带的动态库,动态库系统只加载一次,并可以用于多个程序共享的,一般在用于桌面系统,链接时不会被添加到可执行文件,如果动态链接库不存在,程序可能执行失败 下面正文:

CentOS 7.2+Python 3.7+cuda 10.0+cuDNN 7.6+tensorflow 1.13.1踩坑填坑记

无人久伴 提交于 2019-12-03 08:24:01
CentOS安装tensorflow-gpu的过程遍地是坑,有条件的哥们还是遵从Tensorflow官方建议,直接上Ubuntu。 如下主要包含了几个分支: 安装Python 3 显卡驱动 CUDA/cuDNN tensorflow-gpu glibc和gcc CentOS 7.2安装Python 3.7 CentOS 7.2默认的Python版本是2.7.5,这里采用源码编译安装Python 3.7。 $ ll /usr/bin/ | grep python -rwxr-xr-x 1 root root 11312 Nov 14 2018 abrt-action-analyze-python -rwxr-xr-x 1 root root 7280 Nov 3 2018 pmpython lrwxrwxrwx 1 root root 7 May 24 12:39 python -> python2 lrwxrwxrwx 1 root root 9 May 24 12:39 python2 -> python2.7 -rwxr-xr-x 1 root root 7216 Oct 31 2018 python2.7 $ python Python 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4

动态链接学习的一些简单总结

半城伤御伤魂 提交于 2019-12-03 08:08:59
一、源码编写编译 经过几天的学习,对动态链接进行一些简单的摸索,并将学习总结记录如下。 首先编写两个测试源码文件: [ main.c ] 1 #include <stdio.h> 2 3 extern int subVal; 4 void SubFunc(void); 5 int mainVal = 3; 6 7 void MainFunc(void) 8 { 9 10 } 11 12 int main() 13 { 14 puts("In Main."); 15 16 mainVal = 6; 17 subVal = 6; 18 19 MainFunc(); 20 SubFunc(); 21 22 return 0; 23 } [ subFunc.c ] 1 #include <stdio.h> 2 3 static int staticSubVal = 3; 4 int subVal = 3; 5 6 static void StaticTestFunc(void) 7 { 8 9 } 10 11 void TestFunc(void) 12 { 13 14 } 15 16 void SubFunc() 17 { 18 puts("In SubFunc."); 19 20 staticSubVal = 8; 21 subVal = 8; 22 23 StaticTestFunc

C++基础知识之动态库静态库

匿名 (未验证) 提交于 2019-12-03 00:39:02
一、 静态库与动态库 库(library) ,一般是一种可执行的二进制格式,被操作系统载入内存执行。 我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为 静态库 和 动态库 静态库 和 动态库 区别: 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。因此,使用了静态库的可执行程序存储在磁盘上的空间就比较大。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 静态库 和 动态库 命名规范: linux: 静态库文件名的命名规范是以 lib为前缀,紧接着跟静态库名,扩展名为.a 。 动态库文件名的命名规范是以以 libΪǰ׺ ,但其文件扩展名为.so window: 静态库是.lib文件(但和dll文件的.lib文件是不同的,下面会有阐述)。 动态库是dll文件(Dynamic Linked Library)。 在Windows操作系统中,Visual Studio使用lib.exe作为库的管理工具,负责创建静态库和动态库。 二、在Windows下创建和使用静态库 创建静态库有3个方法: 创建静态库方法一 创建静态库方法二 创建Win32控制台程序时,勾选静态库类型; 创建静态库方法三 工程的“Properties” -> "Configuration Properties” ->

curl更改编译器生成动态库

匿名 (未验证) 提交于 2019-12-03 00:36:02
下载安装包:curl-7.60.0.tar.bz2 1)解压 tar -xvf curl-7.60.0.tar.bz2 2)安装 cd curl-7.60.0 ./configure --prefix=/home/oqm/curl-7.60.0/new-lib --host=mipsel-openwrt-linux CC=/home/code/OpenWrt/toolchain/toolchain-mipsel_24kec+dsp_gcc-5.3.0_musl-1.1.16/bin/mipsel-openwrt-linux-gcc CXX=/home/code/OpenWrt/toolchain/toolchain-mipsel_24kec+dsp_gcc-5.3.0_musl-1.1.16/bin/mipsel-openwrt-linux-g++ make make install 运行结果: 在目录new-lib下生动相关动态库 文章来源: curl更改编译器生成动态库

CMake 基本使用方法

匿名 (未验证) 提交于 2019-12-03 00:26:01
1. 学习背景 C语言工程使用make来构建工程,但是对于大型工程来说文件的依赖关系很复杂,手写makefile非常麻烦,一般开源代码的构建方式都是使用autotool来配置编译环境和自动生成makefile,但是autotool配置涉及到的文件很多,操作步骤比较繁琐,产生了一些替代的方案,cmake是其中最优秀的之一。 cmake相较于autotool简化了很多步骤,只需编写CMakeLists.txt文件,然后运行cmake命令即可。 其实搭建一个非跨平台的工程,我更喜欢eclipse自带的自动构建方式,不用编写什么配置文件,只要在设置里添加头文件路径和库路径,添加文件直接把源文件拷到工程目录下就可以了,因为eclipse里工程目录和文件目录是保持同步的。但是涉及到跨平台的工程,所用到源代码是不同的,对应gcc有不同的编译选项,这时eclipse的灵活性就不够了,需要重新搭建工程。而用自动构建工具的配置文件和脚本结合在一起可以灵活的把不同平台下的编译环境组织到一个工程里面,在makefile里根据需要的平台提供了自定义的多种目标构建方式。 开源代码的编译环境都已经构建好了,不再需要我们重新编写配置文件,运行一条./configure或cmake命令即可,这时会生成一个makefile文件,然后就可以在eclipse指定外部的makefile进行编译了。

解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21&#039; not found 的问题

匿名 (未验证) 提交于 2019-12-03 00:25:02
源码编译升级安装了 gcc 后,编译程序或运行其它程序时,有时会出现类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题。这是因为升级 gcc 时,生成的动态库没有替换老版本 gcc 的动态库导致的,将 gcc 最新版本的动态库替换系统中老版本的动态库即可解决。 1. 问题原因分析 为了安装最新版本的 Node.js (最新版本的 Node.js 使用了 C++ 11 中,而 C++ 11 需要code>gcc 4.8+才能支持),将 gcc 升级到了当前最新版本 v 5.2.0 。升级后,成功编译安装了新版本的 Node.js ( v 4.2.1 ),但运行时程序时出现了以下错误: node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node) node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node) node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)

静态链接 动态链接

匿名 (未验证) 提交于 2019-12-03 00:22:01
我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心。 这个文件叫做 “ 库(Libary) ”,平时我们把编译好的目标代码存储到“库”里面,要用的时候链接程序帮我们从库里面找出来。 静态链接库: 在早期库的组织形式相对简单,里面的目标代码只能够进行静态链接,所以我们称为“静态库” , 静态库的结构比较简单,其实就是把原来的目标代码放在一起,链接程序根据每一份目标代码的符号表查找相应的符号(函数和变量的名字),找到的话就把该函数里面需要定位的进行定位,然后将整块函数代码放进可执行文件里,若是找不到需要的函数就报错退出 。 静态库的两个特点: #1链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘空间较大。 #2如果有多个(调用相同库函数的)进程在内存中同时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。 动态链接库: 动态链接库就是为了解决这些问题而诞生的技术,顾名思义, 动态链接的意思就是在程序装载内存的时候才真正的把库函数代码链接进行确定它们的地址,并且就算有几个程序同时运行,内存也只存在一份函数代码。   动态库的代码必须满足这样一种条件:能够被加载到不同进程的不同地址,所以代码要经过特别的编译处理