先写好实现动态链接库的libmy.cpp文件和libmy.h文件,如下:
// libmy.cpp
#include"libmy.h"
#include<iostream>
using namespace std
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
cout <<"hello world~!" <<endl
}
// libmy.h文件
#ifndef LIBMY_H
#define LIBMY_H
class MyLib
{
public:
MyLib()
~MyLib()
void hello()
}
#endif /*LIBMY_H*/
然后写好pro文件,如下:
TEMPLATE = lib
TARGET =DllTest
HEADERS += libmy.h
SOURCES += libmy.cpp
保存关闭,文件名命名为MyDll.pro
在Shell里执行qmake MyDll.pro,在没有错误的情况下,然后执行make ,可以看到生成了几个后缀名为so的文件,如下图:
证明生成动态链接库成功。然后编写测试动态链接库的主函数,如下:
#include"libmy.h"
#include<iostream>
using namespace std
int main(int argc,char *argv[])
{
MyLib *lib = new MyLib() // 调用刚才编写的动态链接库
lib->hello()
cout <<"danshiming " <<endl
int i
cin >>i
return 1
}
编写main.pro文件,如下:
LIBS += -L ./ # 设置程序查找动态库的目录为当前目录
# 注意:用QT生成的动态库默认都加了lib前缀和扩展名及版本名,但调用时不用加lib,不用加文件
# 扩展名so、不用加版本名1.0.0.即下面LIBS中的DllTest就是实际的动态库libDllTest.so.1.0.0
LIBS+=-lDllTest #注意:调用时不用加lib,不用加文件扩展名so、不用加版本名1.0.0,记得前面加l(字母)
TARGET = libMyTest
SOURCES += main.cpp
执行qmake main.pro生成makefile文件,然后执行make,可以看到生成了libMyTest可执行文件。
将动态链接库libDllTest.so.1.0.0和可执行文件传到arm板上,如下:
在arm板上执行libMyTest,如下:
# chmod +x libMyTest // 先赋予可执行权限
执行:
# ./libMyTest
输出如下:
1、可以 2、Qt Creator只是一个集成开发工具,这个版本随意,网上下就可以,Qte不是用最新,而是最好用跟你在Linux开台开发一样的。首先要在Linux下交叉编译Qte的库,然后再将Lib这些文件移植在板子上,最后通过交叉编译好的库去编译你在pc动态库的生成1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中间文件add.o和sub.o
2>其次生成动态库
gcc -shared –o libtiger.so add.o sub.o
生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和main.c程序生成可执行程序
说明:
以上两部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用动态链接库
在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定动态链接库的路劲,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。
3>但是程序会提示如下错误
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。
4>使用以下方法可以解决此问题
a. 在linux下最方便的解决方案是拷贝libtiger.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo哦,亲)。就可以生成可执行程序了
b.第二种方法是:将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)