九、生成静态库

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 九、生成静态库,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

静态库,在Windows系统下的后缀名为.lib,在Linux下的后缀名为.a。静态库 是一种归档文件(里面包含一到多个.o文件),可对其解压查看。

下面演示通过 在windows cmd命令行下生成.lib的静态库

代码准备

头文件D:\software\项目\Code\LibDemo\static\Header\Students.hpp

#ifndef STUDENTS_HPP
#define STUDENTS_HPP

#include <iostream>
using namespace std;
class Students
{
public:
	Students();
	string Name;
	double Age;
	string Sex;
	double Score;
public:
	void PrintStudentInfo();
};

#endif	// STUDENTS_HPP

源文件:D:\software\项目\Code\LibDemo\static\Src\Students.cpp

#include "Students.hpp"

Students::Students()
{
	
}
void Students::PrintStudentInfo()
{
	cout << "Name: " << this->Name << endl;
	cout << "Age: " << this->Age << endl;
	cout << "Sex: " << this->Sex << endl;
	cout << "Score: " << this->Score << endl;
}

文件位置截图说明: 

九、生成静态库

D:\software\项目\Code\LibDemo\static\Src>g++ -c Students.cpp
Students.cpp:1:24: fatal error: Students.hpp: No such file or directory
compilation terminated.

上面的命令演示的是在编译时没有指定头文件,因为这个头文件和源文件不在同一个目录造成的。

D:\software\项目\Code\LibDemo\static\Src>g++ -I../Header -c Students.cpp

D:\software\项目\Code\LibDemo\static\Src>
上面的命令演示 引入其他目录下的关联头文件,(-I../Header 表示会去Header目录下找相应的头文件) 这里I和../之间是没有空格的。当上述命令执行完毕后,会在Src目录下生成一个Students.o文件。

 下面生产静态库文件:

D:\software\项目\Code\LibDemo\static\Src>ar rcs LibStudents.lib Students.o

其中:ar 是 归档 archive的缩写, rcs 是命令参数  LibStudents.lib 是要生生成的静态库文件名,Students.o指得是要归档的目标文件,后面可以 连接多个目标文件以空格分隔。

九、生成静态库

下面测试生成的静态库是否成功以及怎么使用静态库。

代码准备:

通过QT creator 新建一工程项目:TestMyLib,Qt create 默认把所有的文件都放到项目目录下。为了方便管理各个文件,我们在项目目录下手动创建以下文件,Header用于存放头文件(包括和动态库关联的那些头文件,在使用库文件时,得把和库文件相关联的头文件也得提供,不然在源代码编译的时候提示和库文件中有关联的东西未定义),Lib用于存放引入的库文件,Obj用于存放生成的目标文件,Pro用于存放工程管理文件,Src用于存放源代码文件,Target用于存放生成的可执行文件。

九、生成静态库

九、生成静态库

九、生成静态库

九、生成静态库

九、生成静态库

九、生成静态库 其中TestMyLib.pro文件内容如下: 

QT -= gui core
CONFIG += c++11 console
CONFIG -= app_bundle
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
#DEFINES += QT_DEPRECATED_WARNINGS
#存放编译后的可执行文件等
DESTDIR=../Target
#清理Target目录下文件
QMAKE_CLEAN=../Target/*
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
#引入头文件路径
INCLUDEPATH+=../Header
#添加源文件(这样在Qtcreator的Projects下的Sources下才能看到TestMyLib.cpp)
SOURCES +=../Src/TestMyLib.cpp
#指定库文件 例如:库文件为LibStudents.lib,那么 就是-lLibStudents
#如果库文件为LibStudents.a,那么 就是-lStudents
LIBS +=-L../Lib -lLibStudents
#生成的目标文件存放目录
OBJECTS_DIR=../Obj

 TestMyLib.cpp

#include "Students.hpp"
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
	Students st1;
    st1.Name = "John";
    st1.Age = 13;
    st1.Sex = "Boy";
    st1.Score = 90;
    st1.PrintStudentInfo();
    return 0;
}

QT上截图如下:

九、生成静态库

编译执行结果如下:

九、生成静态库

表明生成的静态库没有问题。

下面演示如何通过QT createor来生成静态库

代码准备

        九、生成静态库

九、生成静态库

可以手动创建上面的工程及目录:

Pro目录下的Students.pro文件、

#-------------------------------------------------
#
# Project created by QtCreator 2022-12-31T23:21:54
#
#-------------------------------------------------

QT -= core gui
TEMPLATE = lib
CONFIG -= app_bundle qt
CONFIG += plugin
CONFIG += staticlib

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
DESTDIR =../Target
VERSION = 0.1.0
QMAKE_CLEAN = ../Target/* ../Obj/*

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += ../Src/Students.cpp
HEADERS += ../Header/Students.hpp
OBJECTS_DIR=../Obj
INCLUDEPATH=../Header

#unix {
#    target.path = /usr/lib
#    INSTALLS += target
#}

编译静态库:只需要点击下面的小锤子构建编译就行,自动会在指定的Target目录下生成响应的库文件,不需要运行。 

九、生成静态库

 生成结果如下:

九、生成静态库

没有生成预期的.lib库文件,经过网上搜索说是通过在QT上使用MinGW编译器,只会生成.dll和.a文件。需要使用MSVC的编译器。但是这里没有安装对应的visio studio 开发工具,所以不具备使用MSVC编译器。但是前面我们演示的时候通过MinGW自带的编译器通过cmd命令行可以生成.lib文件。 

下面我们演示一下生成的libStudents.a文件是否可用,演示的方法和演示LibStudents.lib文件在QT下的使用是一样的,把libStudents.a放到Lib目录下, 只是有一点需要注意:工程配置文件里的

LIBS +=-L../Lib -lLibStudents,改为LIBS +=-L../Lib -lStudents。因为像.so和.a这种文件,在链接会自动补上前面的lib或Lib。经测试文件名为libStudents.a和LibStudents.a都可以链接到。

总结一下:生成静态库命令

g++ -I../Header -c Students.cpp
ar rcs LibStudents.lib Students.o  #生成.lib静态库 — Windows上使用

ar rcs LibStudents.a Students.o  #生成.a静态库 —Linux和Mac上使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142698.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!