关于 动态库的编译和加载

来源:互联网 发布:傻瓜室内设计软件 编辑:程序博客网 时间:2024/05/05 12:11

编译环境 linux  下 c++ 调用库的过程(QT编程)

 

QT 把C++ 编译成动态库。

 

在.pro 中加入如下命令:

TARGET = textso  //库的名字编译出来后 为libtextso.so

TEMPLATE = lib  //模版,指定编译成动态库

DESTDIR = lib    //编译后放在什么目录下

 

 

 

C 语言编译动态库

 

Juny.h juny.c

 

gcc  -I.-fpic   -shared   juny.c  juny.h  -o   libjuny.so

 

注意必须在库名前面加lib 这个是库的标志,没有就找不到库(比如你写成juny.so),当然你说用绝对路径的话那个就不说了,我们现在说的是规范用法,不玩那些小花招。

 

QT中调用库

在 .pro 文件中添加如下:

 

LIBS += -ltextso  这个是 c++库

LIBS += -ljuny   这个是c 库

 

注意:必须把他们的头文件拷贝过来放到项目中。

Textso.h   juny.h

 

下面是在mian.cpp 中对库的使用

 

#include "textso.h"

extern "C"

{

#include "juny.h"

}

int main(void)

{

   textso ss ;

   ss.kkk();

   juny();

 

   return 0;

}

 

注意 extern"C"{}

必须这样写,为什么呢。

因为c语言和c++编译后的名字不一样

比如void foo( int x, int y );  呵呵这个是百度前人的经典案例

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

 

如果你不用extern 的话,链接时编译器就找不到你的函数名字, 这样就会报错,或者不是你想要的结果了,呵呵, 这个问题其实很经典的,也是C++经常面试的问题。

 

补充,上面编译的.so 文件放到/usr/lib/ 目录或者  /lib/ ,当然推荐是放到前面那个目录,因为这个是我们编译的库,并非系统的库, 这个是规范化的问题。哈哈,要深入了解,自己百度一下。

 

最后值得注意的是,如果你是加载C++的动态库, 你必须创建一个对象,这个是因为c++把这些个调用封装在class 中,所以要创建一个对象实例,才能调用其中的方法或者数据。而c语言吗比较直接,直接上就可以了。呵呵,别想歪了去。

 

textso ss ;

ss.kkk();

juny();

 

顺便说一下QT的应用,以下言论仅仅代表此人个人的主观观点,与我本人无关, 如有错漏,欢迎指正。

 

QT 据说是挪威的一个某某发明的一个开发工具,在嵌入式上使用的比较多, 他有以下优势,就是在Windows 和linux 下都可以开发, 还有就是在内存比较少,总共有200多个库,库好像比较少,其实很多东西不在多,不在大,够用就好了。 据说把QT 库 全部搞进系统里面,最少的情况只占10M多的资源, 在以前那个内存极其有限的情况下,这个可是很具优势啊。哈哈。当然据前辈说还有个叫做MiniGUI的(由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统),国产啊,有能力的要多多支持啊。比QT更加节省资源,那个有机会要看看,使用在智能家居和医疗方面很牛逼,我们经常去医院照那个B超什么的大多就是用他了,现在发展到了3.0,据说图像界面已经很牛逼了,他的系统只需要16M就可以跑起来,真是省啊,绝对的经济适用男。这个系统再国内嵌入式也是比较受欢迎,当然在某些领域了。在此表示支持啊。

比QT更加节省资源,那个有机会要看看,使用在智能家居和医疗方面很牛逼,我们经常去医院照那个B超什么的大多就是用他了,现在发展到了3.0,据说图像界面已经很牛逼了,

 

还有就是qT的消息和槽函数(相当于线程之间的通讯, 也就是类之间的数据传递 ),很是方便, 当然了,方便的前提是你必须会运用他,熟悉他。但是你也别担心, 因为QT的编译器会给你提醒, 如果你写的不对,是编译不过的,这有点废话了,哈哈。

 

当然了, 面对现在内存动不动就上G的嵌入式设备, QT 的优势就渐渐的少了, 以后会怎么样,谁也不会知道,但是目前在嵌入式方面 应该还是有很高的地位的吧,其实这个开发工具并不重要,重要的是编程的思想,万变不离其中, 比如:类的构建、 数据的封装、

指针的使用(当然java好像可以不必关心这个东西, 但是在java中调用空指针还是会崩溃的,因为在java中对象就是一个指针, 你没有new 他 就调用就会非法。所以我觉得指针在那里都要谨慎对待, 怎么安全,应该怎么使用, 这样程序就具体了健壮性了)、算法的设计和使用, 项目函数注释(这个我是很主张的, 以为本人的技术有限, 那些高手经常不写注释, 搞的我看起来很难理解, 还得老跑去问他, 那他是自作自受啊, 因为我是新认了,问他,他不能发脾气, 哈哈, 所以我建议, 如果你的代码写的不好, 要写说明, 写的好, 也要写注释, 这样可以给后辈留下一下积累啊, 是吧, 中国不就是缺少这些技术的积累吗, 我辈多多努力啊)、还有就是交流了、技能交换、信息交换、等等。