-
2019-08-28 14:31:22
使用vs2017编译生成工程的时候,出现了如标题所示的错误。因为调用的库的问题,出现了如下的错误:
解决办法:属性->常规->项目默认值->全程序优化 将这里的默认项 “使用链接时间代码生成”改为“无全程序优化, 接下来就可以运行了。
更多相关内容 -
Linux库文件使用与编译
2018-10-11 17:41:53Linux库文件 静态库 在Linux中,以.a为后缀,如libtest.a 直接拷贝函数到二进制映像文件 只需要运行二进制文件,可以直接运行 共享库 在Linux操作系统中,以libxxx.so.x.x为格式命名 可执行文件在开始运行时将...介绍在Linux下使用静态库、共享库、动态库的方法。
Linux库文件
- 静态库
- 在Linux中,以.a为后缀,如
libtest.a
- 直接拷贝函数到二进制映像文件
- 只需要运行二进制文件,可以直接运行
- 在Linux中,以.a为后缀,如
- 共享库
- 在Linux操作系统中,以
libxxx.so.x.x
为格式命名 - 可执行文件在开始运行时将函数从共享库文件中读出,从而间接引用
- 好处是,当函数接口没变,实现改变时,不需要再次编译
- 在Linux操作系统中,以
- 动态库
- 动态加载库在指定位置加载的函数库
- 可以减少内存开销
库函数基本路径
/lib
- 标准共享库和静态库
/usr/lib
- 标准共享库和静态库
/usr/local/lib
- 本地函数库
库文件搜索顺序
- 首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找(一般都没有给此环境变量赋值)
- 搜索动态装载器在/etc目录下的缓存文件/etc/ld.so.cache(此文件由命令ldconfig创建更新)。
ldd
命令–查看到某可执行程序共享库清单
创建静态库
-
libhello.c
为要构建的库文件源文件,libhello.h
为调用此库文件的头文件,usehello.c
为测试程序。 -
首先将所需要文件编译成目标文件
-
gcc -c libhello.c
-
-
使用
ar
命令创建静态库-
ar rc libhello.a libhello.o
-
-
编译运行
-
gcc -o usehello_static usehello.c libhello.a
-
-
创建共享库
-
首先将所需要的库编译成目标代码,这里生成与位置无关,可以在任何地址被链接和装载:
-
gcc -fPIC -Wall -g -c libhello.c
-
-
使用
-shared
来创建共享库-
gcc -g -shared -Wl,-soname,libhello.so.1.0 -o libhello.so.1.0 libhello.o
-
这里的
so.1.0
表示对应的完整版本号,具体可参考这里。
-
-
创建
soname
连接:-
ln -sf libhelloso.1.0 libhello.so
-
这里创建一个链接,只是为了方便以后版本更新时,只需要更改链接的路径,不改变编译代码
-
-
编译并连接引用库文件
-
gcc -Wall -g -c usehello -o usehello.o gcc -g -o usehello_dynamic usehello.o -L ./ -lhello //连接引用库文件
-
其中,
-L
表示搜索路径,./
表示搜索当前路径 -
-lhello
- 会自动在
-l
前变为lib
,加上.so
,变为libhello.so
- 会自动在
-
-
运行,需要添加当前目录
pwd
到环境变量中-
LD_LIBRARY_PATH=$(pwd) ./usehello_dynamic
-
-
如果希望在使用连接器时不使用
-Ldirectory
标识就可以查找到该库,则可以采用以下方式之一:- 把此库拷贝到/usr/lib或者/lib文件夹中,或者在此两个文件夹任意一个中创建一个到该库的快捷方式,并命名为libname.so。
- 如果库所在路径没有在/usr/lib和/lib文件夹下,需要将该路径添加到文件“/etc/ld.so.conf”中,每一行增加一个路径,完成以上设置后,然后运行ldconfig命令更新库信息。
动态库
-
在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是运行时加载。
-
有专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
- dlopen
- dlerror
- dlsym
- dlclose
-
使用示例
- 静态库
-
动态库的创建与调用
2019-04-16 00:43:45动态库的创建: 先创建一个目录用来后续操作: 然后在Dynamic目录下编辑两个文件,calculate.h和calculate.c,此两个文件和静态库用到的文件...目标文件指最终生成的动态库文件,一般后缀为.so 当工程文件数...动态库的创建:
先创建一个目录用来后续操作:
然后在Dynamic目录下编辑两个文件,calculate.h和calculate.c,此两个文件和静态库用到的文件一样:
编译:
命令:gcc 源文件 -fPIC –shared –o 目标文件
源文件只.c文件,当工程文件数目较少(只有一个)时,便可直接编译
目标文件指最终生成的动态库文件,一般后缀为.so
当工程文件数目较多时,可使用Makefile来编译
Makefile文件:
至此,动态库创建成功!
调用动态库:
设计测试main.c来测试库中的函数
使用命令gcc main.c –L. –lcalculate可直接生成a.out
-L.:-L参数用来指定库的位置,.表示当前路径
-l(小写字母l):表示要链接的库,-l后直接写库名就行,不需要前缀和后缀(比如-lcalculate表示链接的库为libcalculate.so)
使用动态链接库:
在编译程序时,使用动态链接库和静态库是一致的,使用“-l库名”的方式,在生成可执行文件的时候会链接库文件。
命令:
gcc –o maintest main.c –L ./ -lcalcualte
maintest:生成的可执行文件(自己命名)
-L:-L参数用来指定库的位置 此参数之后的./即表示当前路径
-l(小写字母l):表示要链接的库,-l后直接写库名就行,不需要前缀和后缀(比如-lcalculate表示链接的库为libcalculate.so)
*链接动态库的位置必须正确!!
动态调用动态库:
Linux提供dlopen()、dlsym()、dlclose()、dlerror()函数来获取动态链接库的函数。
dlopen()函数的使用示例为:
void *dlopen(const char* filename,int flags);
其中参数flags的取值有三个,RTLD_LAZY、RTLD_NOW和RTLD_GLOBAL,其中RTLD_LAZY表示动态库中存在的未定义的变量,不执行解析,即暂缓决定,等有需要时再解出符号;RTLD_NOW表示动态库中存在的未定义的变量,执行解析,即立即决定,返回前解出所有的未决定的符号;RTLD_GLOBAL使得动态库中的解析的定义变量在随后的其他的链接库中变得可以使用。
dlsym()函数:取函数执行地址,原型为:void *dlsym(void* handle,char* symbol);此函数根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。
-
创建和使用动态库 使用def文件
2017-08-01 08:53:34这个是vs2013自动生成的,但是你在建立项目的时候,选择了空项目,所以就没有,如果没选择空项目就会有这个文件,但是他会包含很多的其他的依赖文件,这里都去除了,我们是要生成一个纯净的动态库, // dl打开vs2013 ,文件-新建,取一个名字
我们这里创建一个空的项目吧
添加头文件MyDll.h
源文件
建立源文件dllmain.cpp,要包含window.h文件,这个是vs2013自动生成的,但是你在建立项目的时候,选择了空项目,所以就没有,如果没选择空项目就会有这个文件,但是他会包含很多的其他的依赖文件,这里都去除了,我们是要生成一个纯净的动态库,
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}建立source.def
在此文件第一行引号中填项目名称就好了,EXPORTS下面表示要生成的函数名称 格式:“名称 @序号”)
生成解决方案,发现该项目目录下的Debug下生成了文件 dll lib
2 项目调用库文件的用法
以同样的方式生成项目,但这次不是选择dll了,控制台程序
将上面项目的头文件和生成的库文件复制到该项目来
建立自己的源文件UseDll.cpp 内容是
有时候需要经文件包含的目录和库文件添加进来
运行
测试成功了
如果我在库文件中这样写
生成的库文件再拿过来
-
如何在博途环境下使用库文件来共享代码?
2020-12-21 04:40:20好了,关于使用库文件在多个项目之间共享程序和数据就先介绍到这里。如果你喜欢这篇文章,可以去官网(http://www.founderchip.com)下载本文PDF版本。 关于文章配图是使用中文还是英文,欢迎去公众号(founderchip... -
gitee使用教程,创建项目仓库并上传代码
2020-09-21 17:45:08文章目录一、关于gitee二、安装git三、登录gitee四、生成SSH公钥五、配置SSH公钥六、创建一个项目七、克隆仓库到本地八、关联本地工程到远程仓库九、添加文件十、执行git命令,提交文件十一、常用的git命令 ... -
静态库的创建与调用
2019-04-15 18:04:27静态库的创建: 静态库后缀通常以.a结尾,链接生成静态库时需要使用ar命令。 常用参数: r 在库中插入(修改)模块(替换静态库)。当插入的模块名已经在库中存在, 则替换同名的模块,如若干模块中有一个模块... -
iOS创建.a和.framework静态库,以及Bundle资源文件的使用
2017-05-15 17:27:38我们可以把一些不愿意让别人见到的代码,用静态库的方式把它隐藏起来,只留下.h文件显示方法供编程人员使用。而.a文件出了静态库本身外,还需要引入.h文件,而.framework就不需要如此,由于.framework的方便性所以... -
Xilinx SDK创建并使用静态库
2020-04-23 17:58:06Xilinx SDK创建并使用静态库创建静态库加载使用静态库添加静态库和头文件到目标工程链接到静态库 本文记录了利用Xilinx的SDK工具创建并使用静态库的方法,SDK版本号2019.1。 创建静态库 新建一个Library工程,如下图... -
使用python的netCDF4库读取.nc文件 和 创建.nc文件
2019-10-05 17:14:23使用python netCDF4库读取.nc文件 和 创建.nc文件 1. 介绍 .nc(network Common Data Format)文件是气象上常用的数据格式,python上读取.nc使用较多的库为netCDF4这个库,下面将介绍这个库的具体方法。 安装很简单:... -
CodeBlocks创建静态链接库和使用
2015-06-30 10:34:08本文主要介绍了CodeBlocks下创建并使用静态链接库。 -
C#动态链接库的创建与使用
2017-11-24 00:01:49C#动态链接库 -
动态库def文件的使用
2018-03-04 13:24:41另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。首先创建 一个DLL程序,.cpp中int __stdcall Add(int numa, int numb) { return (numa + n... -
C++:动态库的创建与调用——def文件
2019-02-16 22:01:16动态库的创建有两种方法:不使用.def的方法 和 使用.def的方法; 示例: 写个简单的动态库,里面有两个函数,能实现加法减法 s1: 创建一个空动态库dll, 新建头文件sss.h, 在头文件中写入如下代码 s2: 再创建... -
对象或库文件 "xxx.lib" 是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
2017-11-24 15:19:13如果报错的是 lib文件,那么就将 lib源代码的工程属性中的全程序优化给关掉,重新编译之后再放入当前工程编译,就不会再报这个错误了。 但是目前也是只知其然而不知其所以然,还需要多多研究。 先记 -
Linux下静态库.a与.so库文件的生成与使用
2018-03-28 13:27:07编辑四个文件:A1.c A2.c A.h test.cA1.c:#include <stdio.h>void print1(int arg){printf("A1 print arg:%d\n",arg);}A2.c:#include <stdio.h>void print2(char *arg){... -
error C1047:对象或库文件release\...lib是使用比创建其他对象所用编译器旧的编译器创建的:请重新生成旧...
2019-01-08 22:07:22项目--》属性--》c/c++--》优化--》全程序优化,否。 -
AD20使用之 怎么使用第三方PCB文件或封装库文件
2020-09-16 21:52:12怎么使用第三方PCB文件或封装库文件1、复制第三方封装库中封装1、打开文件2、复制封装3、粘贴封装到自己的封装库中4、完成2、将第三方封装库导入到自己项目中3、从第三方PCB文件中生成封装库 1、复制第三方封装库中... -
Linux下静态库、共享库的创建与应用
2019-02-15 09:53:562 用例子说明两种库的创建与应用 2.1 静态库的创建与应用 2.1.1 静态库的创建 2.1.2 静态库的应用 2.1.3 静态库搜索路径 补充说明 2.2 共享库的创建与应用 2.2.1 共享库的创建 2.2.2 共享库的应用 2.2.2 ... -
Linux动态链接库.so文件的创建与使用
2012-03-12 19:32:591. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个... -
Delphi D10.X 安卓APP开发中创建密钥库文件
2020-03-02 14:02:19关于签名,同学使用delphi做开发的朋友通常都会忽略,特别是同时开始学习时,因为通常大家都没有习惯去注意签名的事,因为开发时好像根本没有这个操作,APK同样可以安装到手机上,并正常运行与调试。这是由于大家在... -
tcl库、包、模块的创建与使用
2017-09-27 22:40:281.库的创建与使用 step1:进行库的创建,即创建指定目录中的脚本文件集。通常来说这些文件的名称以 .tc l结尾。 step2:建立索引,供自动加载机制使用,形式如下 auto_mkindex . *.tcl auto_mkindex 不是一条内建... -
C#中创建DLL(动态链接库)及其使用
2019-08-11 17:40:57一、DLL 与应用程序 动态链接库(也称为 DLL ,即为“ Dynamic Link Library ”的缩写)是 Microsoft Windows 最重要的组成要素之一,打开 Windows 系统文件夹,你会发现文件夹中有很多 DLL 文件, Windows 就是将... -
Unity背包系统(一)使用LitJson库创建并解析Json文件
2017-04-19 18:12:36在这篇文章中我介绍下使用LitJson这个库来创建并解析Json文件(在这系列文章结束篇我会把这些子项目串联起来,介绍实现整个背包系统) 背包系统系列文章会陆续更新,如果大家感兴趣的话可以关注下的博客,同时提供... -
Qt下如何创建多工程项目(包含创建和使用动态库)
2019-08-15 16:21:453、集成使用第三方或自己编写的动态库; 4、对qmake和.pro文件有初步的认识。 下面开始吧! 多工程项目 应用程序在向多进程多动态库方向发展。多工程项目听着很高大上,其实和创建正常的单进程项目一样的简单。区别... -
linux系统下的“静态库和动态库”专题之二:库的创建和使用
2018-04-04 09:56:48接上文【linux系统下的“静态库和动态库”专题之一:库的概念和规则】所述,我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。 – 静态库在程序编译时会被连接到目标代码中,... -
对象或库文件“XXX.lib”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
2017-04-24 17:05:02vc2012 编译用以前版本生成的lib (如2005...1>LINK:fatalerrorC1047:对象或库文件“libspeekdsp.lib”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库 1>LINK:fatalerrorLNK1257:代码生成失败 -
【Qt】Qt动态库和静态库的创建和使用
2017-11-16 12:43:00点击“Choose”进入下一步选择创建库的类型:共享库选择Kit套件选择需要的模块配置工程路径、名字等Qt Creator自动创建的文件我配置的动态库名字为:Share pro文件内容QT -= gui #在选择需要的模块时,我只选用了... -
怎么为vscode添加库文件
2020-12-22 18:39:33怎么为vscode添加库文件?问题:由于idea是通过.idea/libbraries/xxx.xml中的配置来使idea关联jar库。直接将idea中的java项目放置vscode中,由于vscode使用自己的配置文件去关联jar库,所以无法运行。解决办法:因为... -
Qt之动态库和静态库的创建和使用
2018-05-24 13:03:39共享库选择Kit套件选择需要的模块配置工程路径、名字等Qt Creator自动创建的文件我配置的动态库名字为:Share pro文件内容QT -= gui #在选择需要的模块时,我只选用了QtCore,没有使用QtGui TARGET = Share #我配置...