创建动态链接库
新建工程
- 启动Qt Creator依次选择 “文件/新建文件或工程…”,在弹出的“新建”对话框中依次选择 “其他项目/C++库”,如下图所示。
- 点击“选择(C)…”出现“C++库”对话框,在对话框中输入工程名称并选择路径,如下图所示。
- 点击“下一步(N) >”,直到出现模块选择的对话框,如下图所示,勾选QtGui。其他按照默认设置即可,直到向导完成。
-
在创建工程向导完成后会自动生成三个文件:GuiDll_global.h,guidll.h,guidll.cpp。我这里的工程名字与图上不同,因此建立的文件名称不同,建立的工程如下图:选中Shadow build,构建目录就是工程的输出路径(也可以不选中Shadow build,在pro文件中指定,下面的测试程序将使用这种方法)
自动建立的文内容如下:
- myqtdll_global.h
这个文件不许要修改,如下
- myqtdll.h
关键字MYQTDLLSHARED_EXPORT的意思是将类Myqtdll
导出。下面对该类进行更改,需求为:创建并显示一个窗口,在窗口中显示一个QLabel控件。更改后的代码如下:
- myqtdll.cpp
下面对该类进行更改,需求为:创建并显示一个窗口,在窗口中显示一个QLabel控件。更改后的代码如下:
- myqtdll_global.h
编译项目
生成动态链接库,其中三个是链接,一个是动态库,另外需要注意生成的路径是上面Shadow build中构建目录所指定的路径。
测试动态库
新建工程
在Qt Creator中创建空白的Qt工程qtdlltest,在工程中添加源文件main.cpp,输入如下代码:
修改文件
由于测试工程引用了libmyqtdll.so动态库,因此需要更改qtdlltest.pro文件,添加如下内容:
其中
DESTDIR =../Debug
意思是编译出来的工程目录是上级的Debug目录,和上面的Shadow build的功能一样。
其中
unix:!macx:!symbian: LIBS += -L$$PWD/lib/ -lmyqtdll
INCLUDEPATH += $$PWD/includes
上面第二行表示添加库libmyqtdll.so,第一行将myqtdll.h头文件的路径添加到工程中。
上面的路径是因为我将动态链接库和头文件放在了工程目录下的lib文件夹与includes文件夹内,其实这两句话也可自动生成,在pro文件内点击右键选择‘添加库‘即可添加include路径与动态库的路径了。
运行
在qt内调试程序即可看到结果。
脱离Qt Creator运行程序
上一步实现了在Qt Creator内的程序运行,但是在终端内运行程序则会提示动态链接库找不到的错误。
由于linux系统默认的动态库加载路径为/lib和/usr/lib等几个系统重要目录,为了方便管理,此处的测试动态库只放在当前工程的lib目录下,因此必须修改环境变量LD_LIBRARY_PATH将lib目录添加到动态库的搜索路径中,命令如下:
export LD_LIBRARY_PATH=$$PWD:$LD_LIBRARY_PATH
上面的意思是将当前目录加入环境变量中,因为我把动态库拷贝到了和可执行文件一个目录下。也就是程序运行时可以在同一目录下搜索动态链接库。