‘壹’ Ubuntu静态库怎么使用
-供参考
linux 静态库的生成与使用
1、windows系统包括静态链接库(*.lib文件)和动态链接库(*.dll文件)。
2、linux通常把库文件存放在/usr/lib或/lib目录下。
linux库文件名:前缀lib、库名和后缀3部分组成,其中动态链接库以.so作为后缀,静态链接库通常以.a作为后缀。
区别:
静态链接库的代码在编译时就拷贝到应用程序中,这样的优点是节省编译时间动态库是程序在开始运行后调用库函数时才被载入。
静态库的创建和使用
1、在一个头文件中声明静态库所导出的函数。
2、在一个源文件中实现静态库所导出的函数。
3、编译源文件,生成可执行代码(.o文件)
4、将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放文件的目录下。
例如:mylib.h声明函数, mylib.c实现函数
1、编译mylib.c生成目标文件:gcc -o mylib.o -c mylib.c
2、将目标文件加入到静态库中:ar rcs libmylib.a mylib.o
3、将静态库到linux的库目录 (/usr/lib 或者 /lib)下:
cp libmylib.a /usr/lib/libmylib.a
4、在调用库函数的文件中添加#include "mylib.h"这样就可调用静态库中函数
5、使用静态库编译:gcc -o main main.c -l mylib
注意:编译时无需带上前缀和后缀。这就是为什么在使用libxml2时librareis(-l)设置为:xml2
-梁兆铃
‘贰’ ubuntu下如何编译C语言
1、首先打开ubnutu开发环境,直接输入组合键ctrl+alt+t调出命令行界面。
‘叁’ 在ubuntu 下 HelloWorld.cpp 如何编译成 HelloWorld.dll
gcc -g filename -o filename
编译器命令
‘肆’ 如何在Linux下来调用用dll库
微软表示:我们的编译器并没有考虑生成的机器码还要能够让linux运行……
开个玩笑,这个问题你得先了解编译原理,windows下的库有两种,一种是native code,这种就别想了,它之所以能够在windows上运行,当然是因为编译器把它们编译成了windows操作系统能够识别的机器码组织形式(严谨地来说,是链接器和加载器的不同,以及各自的系统调用压根就没有互映射性,导致了linux不能使用它们);第二种是.net平台编译出来的类库,这个是生成了中间语言(IL),跟java一样,原则上是跨平台的,不过很多年以来,它只是原则上而已,从来就没跨过。不过现在的好消息是,.net standard已经在包括linux之内的若干操作系统上完成了实现,所以如果你在.net平台上编写一个完全符合.net standard库的dll的话,它是可以跑在linux上的(严格来说,是某些非常新的linux发行版),这就是大名鼎鼎的.net core,也是微软目前在软件开发方向上大力投入的开源社区项目。所以总的来说,微软还是充分考虑到你的这种应用需求的。如果你确实想完成把windows下的应用程序改到linux下面来运行,.net core是目前最好的选择(因为还有个叫Mono的哥们也在做同样的事儿,你同样可以参考)
‘伍’ Ubuntu下使用mingw-w64交叉编译ffmpeg
网上大部分编译windows版ffmpeg的教程都是基于msys+mingw的,完全运行在windows上。由于msys2的性能实在是太糟糕了,编译速度太感人,因此决定研究Linux下使用mingw-w64交叉编译
先是安装ubuntu版的mingw-w64
sudo apt install mingw-w64
然后在configure ffmpeg的时候,在正常的配置项之后加上。
--arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32-
上面是32位库编译的配置,64位的如下
--arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32-
而且最好使用动态库,静态库还需要链接一大堆mingw的库实现,而且还可能链接失败。但这样编译出来的动态库,还需要依赖 libgcc_s_sjlj-1.dll。如果要移除这个依赖,configure的时候还要加上 --extra-ldflags='-static-libgcc'