b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

printf()函数 [转]linux调用动态库so文件(7)

电脑杂谈  发布时间:2018-12-25 20:13:11  来源:网络整理

USING TEST_SO1.SO NOW!

[root@localhost so_src]# ./test_dl test_so2.so

USING TEST_SO2.SO NOW!

[root@localhost so_src]# ./test_dl

Argument Error! You must enter like this:

./test_dl test_so1.so

备注:如果我们去掉test_so1.h和test_so2.h中的extern"C",重新编译执行后将可能会出现什么情况?有兴趣的朋友可以试下:

[root@localhost so_src]# ./test_dl test_so1.so

3.1 link错误信息: usr/bin/ld: /opt/ora10/lib//libclient10.a(upipar.o): undefined reference to symbol 'kpuexes' /usr/bin/ld: note: 'kpuexes' is defined in dso /opt/ora10/lib//libclntsh.so so try adding it to the linker command line /opt/ora10/lib//libclntsh.so: could not read symbols: invalid operation。

如果是64位系统会出现找不到libpng.so和libjpeg.so, find / -name libpng.so 你会发现在usr/lib64下这两个文件是有的,此时即便你--with-png-dir=/usr/lib64都不行,解决这个bug的一个可行的方法就是把这两个文件拷贝到/usr/lib下,然后--with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib。

/usr/lib/test_so1.so:undefined symbol: test。

/usr/lib/test_so2.so:undefined symbol: test。

[root@localhost so_src]# ./test_dl test_so2.so

/usr/lib/test_so2.so: undefined symbol: test

4、 类的调用

加载类有点困难,因为我们需要类的一个实例,而不仅仅是一个函数指针。我们无法通过new来创建类的实例,因为类是在动态库中定义的而不是在可执行程序中定义的,况且有时候我们连动态库中具体的类的名字都不知道。

解决方案是:利用多态性!我们在可执行文件中定义一个带虚成员函数的接口基类,而在模块中定义派生实现类。通常来说,接口类是抽象的(如果一个类含有虚函数,那它就是抽象的)。因为动态加载类往往用于实现插件,这意味着必须提供一个清晰定义的接口——我们将定义一个接口类和派生实现类。

接下来,在模块中,我们会定义两个附加的类工厂函数(class factoryfunctions)(或称对象工厂函数)。其中一个函数创建一个类实例,并返回其指针;另一个函数则用以销毁该指针。这两个函数都以extern"C"来限定修饰。

实例如下:

test_base.hpp中定义一个含有纯虚函数virtual void display() const = 0的基类。

test_1.cpp中定义继承类test1,并实现虚函数virtual void display()const的定义,并实现一个创建类函数和一个销毁类指针函数。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-90978-7.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...