九、生成静态库

静态库,在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上使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VxWorks是一款实时操作系统,支持生成静态库生成静态库可以将一组相关的函数和数据打包成一个文件,方便在程序开发中重用代码和模块。下面是使用VxWorks生成静态库的步骤: 1. 创建静态库文件的源代码文件:首先,编写需要打包到静态库中的相关代码。可以是一组函数、数据结构或其他模块。将这些源代码文件保存在一个文件夹中。 2. 创建Makefile:在保存源代码文件的文件夹中,创建一个Makefile文件。在Makefile中定义编译选项、链接选项和生成静态库名称。 3. 使用编译编译源代码文件:打开命令行终端,切换到保存源代码文件的文件夹中,并执行编译器命令来编译源代码文件。编译后的目标文件将会生成在同一文件夹中。 4. 使用ar工具创建静态库:在命令行终端中,执行ar命令来创建静态库。将编译后的目标文件一起打包进静态库。例如,使用ar命令生成静态库libexample.a:ar rvs libexample.a file1.o file2.o 5. 静态库的使用:编写需要使用到静态库的程序代码文件。在源代码中,使用#include语句将静态库的头文件包含进来。然后,通过在编译命令中链接静态库,将静态库与程序代码文件进行关联。 以上就是使用VxWorks生成静态库的步骤。通过创建静态库,可以方便地组织和重用代码,提高代码的可读性和可维护性。静态库可以在不同的项目中引用和调用,极大地提高了开发效率和代码复用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值