动态库

C++ 的编译、运行和链接

隐身守侯 提交于 2020-02-08 14:37:30
C++ 的预备知识 涉及的内容 C++ 作为编译型语言 C/C++ 的编译器 制作和调用库 利用 GDB 进行调式 总结 涉及的内容 此系列会在开头说明本篇博客涉及的内容,以方式各位使用,如下: 简要介绍编译型语言和解释型语言 C/C++ 的编译器 gcc/g++ 的用法 使用 gcc/g++ 制作静态库和动态库 使用 gdb 进行调试 C++ 作为编译型语言 计算机上可以运行的只有机器指令(由 01 组成),其他任何语言编写的程序(包括汇编)都要翻译成对应的机器指令才能运行,C++ 属于编译型语言。 编译语言有很多,常见的高级语言都是编译语言,如 Java、C\C++、C# 等,特点是运行前要经过一系列的处理,通常将这一过程称为 “编译” ,编译成功后会生成对应的二进制文件,也就是可执行文件(您的程序)。 与之对应的解释型语言有: Python、JavaScript、HTML 等,特点是运行时在进行 “解释” ,即每执行到一条语言就进行解释成对应的机器指令。 大家知道的编译语言速度快,快的地方其实在于“一次编译,多次运行”,而解释型语言则是每次运行时都要进行 “解释” 所以才慢了些。 但是实际开发过程解释型语言较编译型语言快得多喔, 原因也是因为编译型语言运行前要进行编译,当工程较大时,编译可以耗费大量时间,不适合调试,另外学习编译语言的成本和难度较解释型要大。 编译语言的运行

02 cmake使用案例

余生颓废 提交于 2020-02-07 07:42:32
本章节通过一个工程介绍下cmake工程各个模块。使用JetBrains Clion开发工具组织代码。 https://github.com/jasbin2008/cmake-learn.git 1. 多个源文件组织 创建一个工程,添加以下文件: 操作步骤: 1)在根CMakeLists.txt中配置所有子目录下的源文件 # ./CMakeLists.txt cmake_minimum_required(VERSION 3.10) PROJECT(PROJECT_ONE) add_executable(main main.cpp mod1/mod1.cpp mod1/mod1_func.cpp) # 指明需要的源代码文件就好 2)在main.cpp中添加mod1.h,直接调用 2. 使用动态库 现在以动态库的形式重新构建mod1: 1)在mod1文件夹中创建CMakeLists.txt,用于创建动态库mod1 # ./mod1/CMakeLists.txt add_library(mod1 SHARED mod1.cpp mod1_func.cpp) 2)在根目录下的CMakeLists.txt中配置mod1 # ./CMakeLists.txt cmake_minimum_required(VERSION 3.5) PROJECT(PROJECT_ONE) add

Linux下C++/C 编译生成.a 或者.so 库文件

旧城冷巷雨未停 提交于 2020-02-05 04:26:44
最近因为阅读源码的工作,需要自己编译一些 .so 文件或者 .a 文件,查了一些资料,写了一些示例,记录一下。 静态库和动态库 一般程序编译的过程可以分为 编译 和 链接 两个阶段。链接阶段,需要把所有的obj文件(.o)链接起来,生成可执行程序,这个过程可以链接其他外部的库文件。 有时候也有省略写法。 gcc -c test.c #源文件编译,生成 .o 文件 gcc -o test test.o #将Obj文件链接,可以多个文件 #省略写法 gcc test.c #默认生成 a.out gcc -o test test.c #两个阶段省略成一个 库文件里的具体实现时对用户透明的,只是提供功能函数,而用户不能知道库文件爱你的源码实现。如果你不想开源你的具体实现,你就可以只提供库文件供别人使用。库文件分为静态库和动态库文件: 静态库 :一般情况下也就是 .a 文件。静态库就是指在链接的过程中, 将库文件所有数据都整合到目标代码,这样生成的可执行文件执行时就不再需要外部库支持 ,随便哪里运行。这样就导致了静态库编译生成的可执行库文件较大,而且当库文件需要更新改变时,可执行文件也必须重新编译生成。 动态库 :一般情况下就是 .so 文件。与静态库不同, 动态库文件在链接时不会将所有的代码实现整合到目标代码中,而是在可执行程序执行到相应位置时才会去库文件中搜索相应的方法

win10下使用VS2019调用sqlite3环境搭建

给你一囗甜甜゛ 提交于 2020-02-04 10:44:46
文章目录 下载sqlite3 制作使用的动态库sqlie3.lib 在VS 2019环境中添加 下载sqlite3 从sqlite3.org网站下载 https://www.sqlite.org/index.html 用到的sqlite3库及dll库。 sqlite-amalgamation-3300100.zip sqlite-dll-win64-x64-3300100.zip 制作使用的动态库sqlie3.lib 解压sqlite-dll-win64-x64-3300100.zip文件得到两个文件: sqlite3.dll sqlite3.def 在之前已经安装好的Microsoft Visual Studio 2019安装目录下找到link.exe链接执行文件及相应的动态库。我的目录是: E:\Program Files ( x86 ) \Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x64 在该目录下将以下几个文件拷贝到之前解压出的文件夹(sqlite-dll-win64-x64-3300100)下,如下: 然后使用win+r输入cmd打开dos终端,输入 LIB /MACHINE:IX86 /DEF:sqlite3.def 由此制作出了sqlite3.lib动态库

2020+win10亲测+QT5.14+OCI驱动编译以及问题解决+基本使用

旧城冷巷雨未停 提交于 2020-02-03 03:58:10
1.QT5.14下OCI驱动编译完整步骤 1.安装qt的时候手动选择安装源码资源(默认不安装Source的) 2.进入QT安装目录下E:\Qt5.14\5.14.0\Src\qtbase\src\plugins\sqldrivers\oci 双击用qtcreator打开oci.pro文件 进行如下图片内对oci.pro的修改 前提准备: 找到本地oracle客户端的目录 例如:C:\Oracle\instantclient_11_2 (温馨提示:oracle客户端的版本不能比oracle服务端的低) 3.构建项目产生如下错误:’OCIBindByPos2’ was not declared in this scop 4.双击错误可以进入错误显示在qsql_oci.cpp文件的1559行 5.错误原因以及解决方式 新的OCIBindByPos2 ( ) 函数和以前的OCIBindByPos ( ) 函数产生出入 新版本OCIBindByPos2 ( ) 函数第九个参数的数据类型是ub4* 旧版本OCIBindByPos ( ) 函数第九个参数的数据类型是ub2* 故此进行一个强制类型转化,将新版的第九个参数改位ub2*类型即可,同时函数名也要改为旧版本。 6.进行项目构建,产生的驱动程序在qt所在盘符下的plugins目录下的sqldrivers目录中 注意并不是在qt的目录下

linux 动态库搜索路径优先顺序以及Makefile 编译设置

為{幸葍}努か 提交于 2020-01-28 17:04:12
一、linux 下 动态库搜索路径优先顺序 编译目标代码时指定的动态库搜索路径; 环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置后要运行 ldconfig命令才能生效 默认的动态库搜索路径/lib; 默认的动态库搜索路径/usr/lib; 1是最优先的, 使用gcc -Wl,--rpath -Wl,${LIB_DIR1} ./app 指定了搜索路径 注:当elf 可执行程序运行时,会在LD_LIBRARY_PATH 动态库的查找路径 查找,当找到A库时加载,如果其他的文件中存在相同的库函数,若两个库函数不一致,则有可能导致出现undefined symbol。 解决办法: 排查LD_LIBRARY_PATH 的值下的文件中是否存在相同的库文件。 二、linux Makefile -Xlinker --unresolved-symbols=ignore-in-shared-libs 编译动态链接库的时候最好加上 来检查一下。这样如果是自己的疏忽在 .c 源文件里面忘记的 某函数的定义,编译的时候就可以提示错误了 -WL,-rpath= 指定编译的可执行文件首先搜寻的库依赖的文件路径 -Wl,--version-script=Makefile.symbol 编译动态链接库时 选择导出的符号,未导出的符号

GCC 参数详解

心已入冬 提交于 2020-01-27 08:01:23
转载出处: http://blog.csdn.net/yff1030/article/details/8592077 原文:http://www.cppblog.com/SEMAN/archive/2005/11/30/1440.html [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename   设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后 缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀 名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了 下一个参数的使用。   可以使用的参数吗有下面的这些   `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'.   看到英文,应该可以理解的。   例子用法:  

linux下如何使用自己的库函数

与世无争的帅哥 提交于 2020-01-27 05:41:53
******转自别人的,保存下,以备日后需要************* 在 Linux 下如何使用自己的库函数 近日学习了Linux下的库函数,结合网上得到的资料和自己体会,做成以下参考资料 一 使用库必要性 提高代码重用性。 二 库的种类: 1 静态库 一般以 *.a 命名。 程序编译时被加载,此后,只要程序不被重新编译,静态库就没有作用了(可以删掉)。 由于静态库的代码在编译过程中已经被载入可执行程序,因此体积较大,如果有多个应用程序都用了同一个静态库,在存放可执行程序的硬盘中就会有这个静态库的多份拷贝。如果他们同时在运行,那么在内存中也会有这个静态库的多份拷贝。但是如下面提到的动态库相比较,程序执行时间比较短,因为没有执行时库函数的加载。所谓“以空间换时间”。 下面我们用一个实例说明静态库的编程和使用。 // 库函数: hellowlib.c #include <stdlib.h> void printhellow() { printf("hellow,now in lib routine\n"); return ; } 首先生成目标文件: gcc -c printhellow.c –o printhellow.o 然后使用 ar ( archive )命令把目标文件制作库文件: ar cqs libhello.a printhellow.o 注意库文件名一定是 lib***

在 flutter 上使用 c 代码 - (二) 无源码的项目

自作多情 提交于 2020-01-27 03:05:22
写在前面, 对于无源码的项目, 理论上必须有头文件,不然你不知道里面都定义了什么鬼东西. 本篇虽然是写无源码的项目, 但实际上还是会有源码部分, 只是通过 cmake,clang,xcodebuild,ndk 等工具编译成 so/framework 以供 android/ios 引入 生成动态库 整体的目录结构是这样的, 如果你只是要引入库, 可以跳过这步, 这步的主要做源码生成库的步骤 $ tree -L 3 cpp-source tree -L 3 cpp-source cpp-source ├── android │ ├── CMakeLists.txt │ ├── build_android.sh │ └── cmd │ └── android.sh ├── ios │ ├── CMakeLists.txt │ ├── build_ios.sh │ ├── cmd │ │ └── ios_abi_build.sh │ └── ios.toolchain.cmake └── src ├── some.cpp └── some.h src 为源码 some.cpp # include "some.h" # include <stdint.h> extern "C" __attribute__ ( ( visibility ( "default" ) ) ) _

GCC 参数详解

感情迁移 提交于 2020-01-26 18:45:47
[介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename   设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后 缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀 名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了 下一个参数的使用。   可以使用的参数吗有下面的这些   `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'.   看到英文,应该可以理解的。   例子用法:   gcc -x c hello.pig    -x none filename   关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型   例子用法:   gcc -x c hello.pig -x none hello2.c