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
而今迈步从头越
既然这样挑衅
如果小米公司不申冤