Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法 (*)

目录

.pro文件中各变量意义:

Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法

注1:  .pro文件中LIBS用法详细讲解

注2:Qt中Makefile文件里INCPATH和LIBS参数详解

------------------------------------------------------------

参考:
Qt 制作和使用自己制作的 静态库
https://blog.csdn.net/ken2232/article/details/130447146

Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法 (*)
https://blog.csdn.net/ken2232/article/details/130447069

Qt 动态库/静态库的创建和使用教程(step by step) :带笔记(**)
https://blog.csdn.net/ken2232/article/details/130446757

=========================================

Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法

在QT 的Makefile文件中:

1 添加动态库,如lipcap.so

则,在LIBS一行中添加“-L/usr/local/lib -lpcap”,依据自己的情况修改libpcap.so的路径

LIBS += -L/usr/local/lib -lpcap


2 添加静态库,如libtinyxml.a

则,在LIBS一行添加“/home/yzj/tinyxml/libtinyxml.a”;

?完整的代码行为 ??????

        在INCPATH一行添加“ -I /home/yzj/tinyxml -I.”,依据自己的情况修改libtinyxml.a的路径


但是有一个问题,是重新编译后这个Makefile会改变,不知有没有其他添加动态库和静态库的方法,希望不吝赐教。
————————————————
版权声明:本文为CSDN博主「yzj19870824」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yzj19870824/article/details/6933737

注1:  .pro文件中LIBS用法详细讲解

用法:LIBS += -Lzzz  -lxxx  -lyyy

zzz:路径

xxx、yyy:文件

库路径可以有以下的形式:

-L.            表示 .pro所在目录

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

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

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

库文件可以有以下的形式:

若.pro所在目录lib下有解码库需要被链接,msvc版本为“VideoDecoder.lib”,mingw版本为“libVideoDecoder.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

编译就通过了。

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

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

msvc静态库:test.lib

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

mingw静态库:libtest.a
————————————————
版权声明:本文为CSDN博主「百里杨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyhse/article/details/105408639

注2:Qt中Makefile文件里INCPATH和LIBS参数详解

1 LIBS中的-l 和 -L参数 

-l 参数是用来指定程序要连接的库,

-l参数紧接着就是库名, 库名和真正的库文件名的差别, 以数学库为例,

库名为 m , 其 库文件名为 libm.so,也就是把库名头文件的lib 和 .so 去掉就是库名

放在/lib, /usr/lib 和 /usr/local/lib 中的库直接使用参数 -l 链接就可以了, 如果没有放在这三个文件(夹?)中, 那么,我们就要使用-L 加上库文件所在的文件夹, 然后再使用 -l 加上库名就好了。

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如 libm.so它链接到

/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx- x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行
gtk-config --libs

就能得到以下输出

"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm"

这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了 --libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果。现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx -config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。

除了xxx-config以外,现在新的开发包一般都用pkg-config来生 成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成, 用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg-config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+, pkg-config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`。

这段是抄的别人的,  先写在这里吧。

2 INCPATH中的-I 参数

-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,

但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上- I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。

-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的--cflags参数就是用来生成-I 参数的。

INCPATH = -I. -I. -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtWidgets -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtGui -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtANGLE -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtCore -Idebug -I. -ID:\Qt\Qt5.8.0\5.8\mingw53_32\mkspecs\win32-g++


————————————————
版权声明:本文为CSDN博主「代码痴汉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lieyanhaipo/article/details/17056011

.pro文件中各变量意义:

QT中 No such file or directory的解决办法_qt no such file_404技术社区

大家可以想下Makefile文件是如何生成的,是qmake根据.pro文件编译后产生的,那么解决方法为:
在创建工程的时候使用如下语句:
qmake -project QT+=widgets
qmake CH01.pro
查看Makefile.Release(Debug)文件中的INCPATH = -I. -I. -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtWidgets -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtGui -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtANGLE -ID:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtCore -Idebug -I. -ID:\Qt\Qt5.8.0\5.8\mingw53_32\mkspecs\win32-g++

.pro文件中各变量意义:

◆ HEADERS 指定工程的 C++头文件(.h)。
◆ SOURCES 指定工程的C++实现文件(.cpp)。
◆ FORMS 指定需要 uic 处理的由 Qt 设计师生成的.ui 文件。
◆ RESOURCES 指定需要 rcc 处理的.qrc 文件。


◆ DEFINES 指定预定义的 C++预处理符号。
◆ INCLUDEPATH 指定 C++编译器搜索全局头文件的路径。
◆ LIBS 指定工程要链接的库。库既可以通过绝对路径指定,也可以使用源自 Unix 的-L 和-l 标识符来指定(例如,-L/usr/local/lib 和-ldb_cxx)。


◆ CONFIG 指定各种用于工程配置和编译的参数。
◆ QT 指定所要使用的 Qt 模块(默认是 core gui,对应于 QtCore 和 QtGui 模块)。加上模块之后,makefile中的模块头文件目录也就自动加上啦。
◆ VERSION 指定目标库的版本号。


◆ TARGET 指定可执行文件或库的基本文件名,其中不包含任何的扩展、前缀或版本
号(默认的是当前的目录名)。
◆ DESTDIR 指定可执行文件放置的目录(默认值是平台相关的。
例如,在 Linux 上,指当前目录;在 Windows 上,则是指 debug 或 release 子目
录)。
◆ DLLDESTDIR 指定目标库文件放置的目录(默认路径与 DESTDIR 相同)。


CONFIG 变量用来控制编译过程中的各个方面。它支持下面这些参数:

◆ debug 是指具有调试信息的可执行文件或者库,链接 Qt 库的调试版。
◆ release 是指编译不具有调试信息的可执行文件或者库,链接发行版的 Qt 库。如果
同时指定 debug 和 release,则 debug 有效。
◆ warn_off 会关闭大量的警告。默认情况下,警告的状态是打开的。


◆ qt 是指应用程序或者库使用 Qt。这一选项是默认包括的。
◆ dll 是指动态编译库。
◆ staticlib 是指静态编译库。
◆ plugin 是指编译一个插件。插件总是动态库,因此这一参数暗含 dll 参数。


◆ console 是指应用程序需要写控制台(使用 cout、cerr、qWarning(),等等)。
◆ app_bundle 只适用于 Mac OS X 编译,是指可执行文件被放到束中,这是 Mac OS X
的默认情况。
◆ lib_bundle 只适用于 Mac OS X 编译,指库被放到框架中。


关于上面的各个变量的使用方法:

在终端上执行
qmake -project QT+= widgets
则加上了widgets模块,在pro文件中生成 QT+=widgets 语句。
qmake -project SOURCES+= ./src/test/cpp
则在pro文件生成 SOURCES+=./src/test.cpp

注3:   libpcap详解_你回到了你的家的博客-CSDN博客

libpcap(packet capture library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层的包捕获API接口,为底层网络监测提供了一个可移植的框架。

为什么我们在gcc中使用-lpcap,这是什么意思? |

必须将-lpcap与gcc一起使用来编译libpcap程序,但我不知道此标志的含义。有谁能够帮助我??

例:

$ gcc lpcap_demo.c -o lpcap_output.o -lpcap

gcc -l指示GCC将程序与作为命令行选项指定的库链接,并且pcap为的名称libpcap。lib库名称的前缀是隐含的,因此,如果要编写-lpthread,将与libpthread,POSIX线程库-lrt链接,与链接librt,这是实时扩展库,依此类推,等等:)

是的,-lpcap只要您使用从pcap库中导出的符号,就必须进行编译。

您可以通过在终端中键入以下命令来获取更多信息:

man gcc

...并搜索-l选项。这是GCC的手册页:

gcc(1) - Linux manual page

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值