【QT加载静态链接库(.Lib,.a,.os),以及关于LIBS +=的用法】

以下内容由本人收集资料重新编辑的内容

.pro 文件中写入

需要在项目的 .pro 文件中写入加载lib,并且要添加相应的 .h文件进入项目,并引用

核心是 LIBS+=

书写格式:LIBS+= -L直接打地址(库路径) -l库文件(去除后缀)

代码如下(示例):

// 需要在项目的 .pro 文件中写入 加载lib,有多种写法
 LIBS += -L. -limm32 -luser32
 LIBS += -L$$PWD/./ -limm32 -luser32    
在前面加上 Release: 或 Debug: 的区别

分别让程序在不同的情况下调用不同的DLL
代码如下(示例):

Release:LIBS+=-L  folderPath // release 版引入的lib文件路径
Debug:   LIBS+= -L folderPath // Debug 版引入的lib文件路径
LIBS+= 与 LIBPATH +=

看到网上有人说另外一种用法

LIBS+= 指明lib文件的名称,
LIBPATH += 指明lib文件的路径。最后还要把DLL文件复制到exe所在路径(或者system32)


库路径

-L. - - -表示 .pro所在目录

-L$$PRO_FILE_PWD/ - - -表示 .pro所在目录

-L$$PWD/ - - - 表示 .pro所在目录

-LC:/abc/ - - -表示C:/abc/

QT内的特殊表示

PWD
指的是当前正在解析的.pro文件的目录的完整路径。 在编写支持影子构建的项目文件时,PWD很有用。
代码如下(示例):

LIBS += -L$$PWD/.......

OUT_PWD
指的是qmake生成的Makefile的目录的完整路径。即构建目录,例如build-??-Desktop_Qt_5_12_8_MSVC2017_64bit-Debug

LIBS += -L$$OUT_PWD/.......

PRO_FILE
正在使用的项目文件的路径。

LIBS += -L$$_PRO_FILE_/......

PRO_FILE_PWD
包含目录的路径,该目录包含正在使用的项目文件。

LIBS += -L$$_PRO_FILE_PWD_/....
不同操作系统下的静态库

linux:LIBS += your_lib_path/your_lib动态库
linux:LIBS += -L your_lib_path -lyour_lib//经过测试了
win32:LIBS += your_lib_path/your_lib
例如:
LIBS += -L lib/pcsc/ -lpcsclite
LIBS += lib/pcsc/libpcsclite.a


库文件

需要另外加库的程序最好单独建一个文件夹放置

1. 不加-l时,需要写库文件全名(不推荐)
代码如下(示例):

LIBS += -L$$PWD/lib VideoDecoder.lib

LIBS += -L$$PWD/lib libVideoDecoder.a

2. 加 -l 时,可以将不同编译器库文件名差异屏蔽掉

假设链接msvc库,则只需要去掉文件后缀(一般是.lib):
LIBS += -L$$PWD/lib -lVideoDecoder
假设链接mingw/gcc库,则需要去掉文件前缀"lib",和后缀(一般是.a):
LIBS += -L$$PWD/lib -lVideoDecoder

这样不管在哪个编译器下,都能保证命令一致。

注意:
请牢记msvc库只去后缀
mingw库去前缀和后缀。
因为我遇到一个问题,使用msvc编译工程,工程中调用了boost线程库,boost使用msvc编译为静态库,这个静态线程库的名字比较坑“libboost_thread-vc141-mt-gd-x64-1_71.lib”,按照我们一贯的想法,肯定是去掉前lib,去掉后缀.lib,像这样:
LIBS += -LC:/Boost_msvc_static/lib/ -lboost_thread-vc141-mt-gd-x64-1_71
死活编译不过,找不到库文件。此时,你只要想起来链接msvc库只去后缀,像这样:
LIBS += -LC:/Boost_msvc_static/lib/ -llibboost_thread-vc141-mt-gd-x64-1_71
编译就通过了。

如果需要添加的库文件较多,可以这么写:


MYLIBS=-lLBA -lLBB -lLBC

LIBS+=$$MYLIBS

附《msvc、mingw分别编译动态库与静态库文件名区别》:

msvc动态库:test.dll,test.lib

msvc静态库:test.lib

mingw动态库:test.dll、libtest.a

mingw静态库:libtest.a

添加.h文件进入项目

这点应该没什么说的
添加所对应的 .h 文件进入项目,并且在想调用的类里面进行 #include (检查是否“ ”与< >错用了)

添加头文件(或者直接通过右键添加现有文件就好了)

INCLUDEPATH += your_include_path例如:
INCLUDEPATH += . /usr/local/include(点号后面有空格)

本文为各个博主的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
引用的原文链接:https://blog.csdn.net/zyhse/article/details/105408639,https://zhidao.baidu.com/question/489955709.html,
https://www.cnblogs.com/cppskill/p/6207801.html,
https://blog.csdn.net/u010824101/article/details/83154816?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link,
https://blog.csdn.net/libaineu2004/article/details/89366925

  • 24
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上调用,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成的def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.php/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值