Linux 创建静态库以及静态库的使用

简介: 目录: 1 手动建立静态库 2 静态库的使用 3 通过makefile文件建立静态库 1 手动建立静态库 将建立一个简单的静态库 -1: 将所需的源文件编译成目标文件 ------ helpguy.h #ifndef __helpguy_h__#define __helpguy_h__#include <stdlib.h>
目录:

1 手动建立静态库
2 静态库的使用
3 通过makefile文件建立静态库


1 手动建立静态库
将建立一个简单的静态库

-1: 将所需的源文件编译成目标文件

------ helpguy.h

#ifndef __helpguy_h__
#define __helpguy_h__

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void err_msg(const char* errMsg, ...);

#endif // __helpguy_h__

------ helpguy.cc

#include "helpguy.h"

#include <stdarg.h>

#include <errno.h>
#include <string.h>

void exit_msg(const char* errMsg, ...)
{
     va_list ap;
    
     va_start(ap, errMsg);

     int errno_save = errno;
     char buf[1024];
     vsnprintf(buf, sizeof(buf) - 1, errMsg, ap);

     if(errno_save != 0)
     {
          int len = strlen(buf);
          snprintf(buf + len, sizeof(buf) - len - 1, ": (%d) %s",
                    errno_save, strerror(errno_save));
     }

     strcat(buf, "\n");

     // output
     fflush(stdout);
     fputs(buf, stderr);
     fflush(stderr);

     va_end(ap);

     exit(1);
}


编译:

g++ -c helpguy.cc  // 生成文件: helpguy.o

-2 将目标文件创建成静态库文件
一般静态库名称为libxxx.a,在使用时,在命令行末尾添加 -lxxx, 那么,编译就会查找
libxxx.a或者libxxx.so文件。 

ar crs libhelpguy.a helpguy.o // 生成库文件:libhelpguy.a


2 静态库的使用

------ 测试文件 main.cc

#include "helpguy.h"

#include <iostream>

int main(int argc, char** argv)
{
     std::cout << "Please enter positive integer: ";
    
     int value;
     std::cin >> value;

     if(value <= 0)
          exit_msg("need positive integer");

     std::cout << "The value is: " << value << std::endl;
     std::cout << "OK" << std::endl;

     return 0;
}



编译:

g++ -o main main.cc -L. -lhelpguy // 生成: main文件
./main
当你输入非整数的时候就会调用exit_msg

-L. 告诉编译器在当前目录洗"."寻找名为 libhelpguy.a或者libhelpguy.so库文件


3 通过makefile文件建立静态库

----- makefile

CFLAGS=-g -D__STDC_FORMAT_MACROS -Wall -Werror -I.
LIBS=-lrt -pthread

libhelpguy.a: helpguy.o
     ar crs $@ $^
     chmod u+x $@

helpguy.o: helpguy.cc
     g++ -o $@ -c $< $(CFLAGS)

clean:
     rm -rf helpguy.o

输入make命令即可创建静态库文件:

make
g++ -o helpguy.o -c helpguy.cc -g -D__STDC_FORMAT_MACROS -Wall -Werror -I.
ar crs libhelpguy.a helpguy.o
chmod u+x libhelpguy.a

如果你有多个.o文件,可以在libhelpguy.a: 后边继续添加,然后模仿 helpguy.o添加
生成目标文件的命令。




相关文章
|
4月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
106 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
166 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
4月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
35 0
|
6月前
|
存储 Linux C语言
Linux|如何安装和运行多个 glibc 库
Linux|如何安装和运行多个 glibc 库
1230 5
|
6月前
|
Linux 编译器 C语言
Linux中的pkg-config:简化库依赖管理的利器
**pkg-config**是Linux下管理库依赖的工具,它通过读取库的`.pc`文件提供编译和链接参数。使用`pkg-config --cflags --libs &lt;library&gt;`获取编译和链接选项,例如`gcc -o test test.c $(pkg-config --cflags --libs glib-2.0)`。能进行版本检查、参数提取、依赖管理和路径搜索。列出所有包用`pkg-config --list-all`。最佳实践包括确保库正确安装、检查版本、配置`PKG_CONFIG_PATH`及使用构建工具。
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
49 1
|
6月前
|
存储 编解码 Ubuntu
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
【QT】linux下alsa库的移植和QT中音视频的处理&笔记