Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

本文解释了Linux下Qt编译过程中.o、.a、.so及其变体的区别,特别是.so文件的软链接特性,并指导如何在Qt项目中通过调整pro文件来控制动态库版本和生成文件数量。
记录一下遇到的问题:

Linux系统下Qt编译第三方动态库会生成多个.so文件,不了解的小伙伴可能很疑惑:
(1)Linux 下 QT 生成的(.o)、(.a)和(.so)三个文件的区别
(.o)就相当于windows里的obj文件;
(.a)即 linux 下的静态链接库(Statically Linked library),或称静态库;
(.so)即 linux 下的共享库(Shared library),或称动态库;
【备注】在VS中静态库的后缀名为(.lib);动态库的后缀名为(.dll)。

(2)Linux 下 QT 生成的(.so)、(.so.1)、(.so.1.0)和(.so.1.0.0)四个文件的区别
QT在生成动态库时,会默认生成(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)四个文件。
其中,(.so.1.0.0)为实际的动态库文件,(.so)、(.so.1)、(.so.1.0)均为软链接,都是指向(.so.1.0.0)的链接文件,为了版本控制。

如果不需要Qt生成版本控制,只要单独的so,在pro文件中添加:

CONFIG += plugin

加上之后,使用QCreator编译完之后只会生成一个.so文件;

### 在Linux环境下使用QT4生成共享库(.so)以及调用的方法 在Linux环境下,使用QT4生成共享库(.so文件)并进行调用的过程主要包括以下几个方面:动态库的创建、动态库的加载以及动态库的调用。以下是详细说明。 #### 动态库的创建 为了在Linux环境中使用QT4生成共享库,首先需要创建一个动态库项目。具体步骤如下: 1. 打开QT Creator,选择“文件”->“新建文件或项目”,然后选择“库”->“C++库”,最后点击“选择”按钮[^1]。 2. 在接下来的向导中,选择“共享库”作为库类型,并完成项目的配置。 3. 编写动态库的接口函数和实现代码。例如,可以定义一个简单的函数用于测试: ```cpp QString printfAppPath(); QString printfCurrentPath(); ``` 实现这些函数时,确保它们符合动态库的标准导出规则。 4. 编译生成动态库文件(通常为lib.so格式)。编译完成后,会在指定目录下生成类似`libTest.so`的文件[^1]。 #### 动态库的加载与调用 动态库可以通过两种方式加载和调用:一种是直接链接的方式,另一种是通过`QLibrary`动态加载的方式。 ##### 直接链接方式 1. 在主程序中包含动态库的头文件,并将动态库的路径添加到系统库路径中(如`/usr/lib`),或者设置环境变量`LD_LIBRARY_PATH`指向动态库所在的目录[^1]。 2. 使用`qmake`工具将动态库链接到主程序。例如,在`.pro`文件中添加以下内容: ```plaintext LIBS += -L/path/to/library -lTest INCLUDEPATH += /path/to/include ``` 3. 在代码中直接调用动态库中的函数。例如: ```cpp #include "testlib.h" int main() { QString appPath = printfAppPath(); QString currentPath = printfCurrentPath(); qDebug() << "App Path:" << appPath; qDebug() << "Current Path:" << currentPath; return 0; } ``` ##### 使用`QLibrary`动态加载方式 1. 定义动态库接口的类型声明。例如: ```cpp typedef QString (*TYPE_printfAppPath)(); typedef QString (*TYPE_printfCurrentPath)(); ``` 2. 创建`QLibrary`对象并加载动态库文件: ```cpp bool loadLibrary(const QString& appPath) { QLibrary *m_pLibTest = new QLibrary(appPath + "/dll/libtestDll.so"); if (!m_pLibTest->load()) { qDebug() << "Failed to load library:" << m_pLibTest->errorString(); return false; } TYPE_printfAppPath printfAppPath = (TYPE_printfAppPath)m_pLibTest->resolve("printfAppPath"); TYPE_printfCurrentPath printfCurrentPath = (TYPE_printfCurrentPath)m_pLibTest->resolve("printfCurrentPath"); if (!printfAppPath || !printfCurrentPath) { qDebug() << "Failed to resolve symbols"; return false; } QString appPathResult = printfAppPath(); QString currentPathResult = printfCurrentPath(); qDebug() << "App Path:" << appPathResult; qDebug() << "Current Path:" << currentPathResult; return true; } ``` 3. 调用动态库中的函数,确保动态库文件存在并且符号能够正确解析[^4]。 #### 注意事项 - 如果在调试模式下运行程序正常,但单独运行时提示找不到动态库文件,可能是因为动态库路径未正确配置。此时可以将动态库复制到系统库目录(如`/usr/lib`),或者通过设置环境变量`LD_LIBRARY_PATH`来解决[^1]。 - 确保动态库的接口函数具有正确的导出属性,避免符号无法解析的问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值