c++创建和使用静态库

合集下载

CodeBlocks静态库的创建和使用

CodeBlocks静态库的创建和使用

过程第一步:启动code::blocks后,选择“Creat a new project”,如下图图标,后,弹出“New from template”对话框,如下图,拖动右侧的滚动条,选择其中的”Static library”, 在点击右上角的”Go”按钮,后弹出“Static library”对话框,如下图点击“Next”按钮,后进入下一步,输入工程名称和保存路径,如名称为“mylib”,保存路径为“F:\Ctest\”,其中四个文本框,只需填前两个,下面两个会自动生成。

如下图,点击”Next”按钮,进入下一步,配置相关的编译器,调试和发布版本的信息,选择默认即可,如下图点击“Finish”按钮,进入主界面,将作出的管理窗口“Workspace”下的目录展开,如下图,右击仅有的main.c文件,弹出一个浮动的菜单,如下图选择其中的“Rename file...”弹出“Rename file”对话框,如下图,将文本框中的名字改为“mylib.c”,点击”OK”按钮,左侧的管理窗口中的“main.c”文件名字变为“mylib.c”,如下图双击“mylib.c”文件名,进入文件编辑状态,从中添加你所有想要包含的函数,若还有其他很多源文件和头文件,可选择“File”下拉菜单的“new”菜单的“Empty file”,如下图我们这里创建一个“mylib.h”的头文件,当点击了“Empty file”后,弹出一个消息框,问是否将文件添加入工程,如下图点击“是”,之后生成一个“Save file”对话框,如下图将文件名改为“mylib.h”,后点击保存,在生成的对话框点击”OK”, 可以进行编辑文件了,几乎和普通工程没区别,全局变量、头文件等都存在,只是去掉main函数,确定要创建静态链接库的函数为最外层函数入口。

我们做一个两个正整数中加大者的函数1、头文件的声明如下图2、在源文件“mylib.c”中编辑代码第二步、编译、调试、直至成功3.切换到工程目录“F:\Ctest\mylib\bin\Debug”下,可以看到生成的“libmylib.a”,这个就是生成的静态库,名字中前五个字母“libmy”和我们的工程名一致,其后的“lib.a”是系统指定的静态库的固定格式,此时生成的所有文件中对我们有用的有两个:一个是“libmylib.a”的静态库文件,另个一是在目录“F:\Ctest\mylib”下的“mylib.h”头文件,在F盘下建立文件夹“mylib”,在“mylib”中创建两个文件夹“lib”和”include”,把文件“lib.a”拷贝到“F:\mylib\lib”目录下,把文件“mylib.h”拷贝到“F:\mylib\include”目录下。

使用Automake生成Makefile及动态库和静态库的创建

使用Automake生成Makefile及动态库和静态库的创建

使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:[c-sharp]view plaincopy1.example2.|——src 目录(存放源代码文件)3. |——hello.c4.|——lib 目录(存放用来生成库的文件)5. |——test.c 用来生成静态库libhello.a6.|——include 目录(存放程序中使用的头文件)7. |——hello.h2. 编写的各个目录下的源文件[c-sharp]view plaincopy1.hello.h 文件2.extern void print(char *);3.test.c 文件4.#include<stdio.h>5.void print(char *msg)6.{7.print(“%s/n”, msg);8.}9.hello.c 文件10.#include “hello.h”11.int main()12.{13.print(“Hello static library!”);//这里用到的是静态库中的函数14.return 0;15.}3. 编写lib/Makefile.am 文件[c-sharp]view plaincopy1.noinst_LIBRARIES=libhello.a2.libhello_a_SOURCES=test.c3.AUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。

第二行表示用来生成静态库的源文件。

如果要把静态库生成到其他地方,可以在=后面加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。

第三行AUTOMAKE_OPTIONS 是Automake 的选项。

Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。

gcc编译lib

gcc编译lib

GCC编译lib简介GCC(GNU Compiler Collection)是一个开源的编程语言编译器集合,它支持多种编程语言,包括C、C++、Java、Fortran等。

在开发过程中,我们经常会使用GCC 来编译源代码,生成可执行文件。

除了编译应用程序,GCC还可以用于编译库文件(lib),供其他程序调用和链接。

本文将介绍如何使用GCC编译lib,包括编译选项的设置、库文件的生成和使用方法等。

编译选项编译lib时,我们可以根据需求设置不同的编译选项,以控制编译过程和生成的库文件的属性。

常用的编译选项有:•-c:仅编译源文件,生成目标文件(.o文件),不进行链接操作。

•-o:指定生成的目标文件名或库文件名。

•-g:生成调试信息,方便调试程序。

•-Wall:显示所有警告信息。

•-O:优化选项,可选取值为0、1、2、3,数字越大优化级别越高。

•-shared:生成共享库文件(动态链接库)。

•-static:生成静态库文件。

可以根据实际需要选择适合的编译选项。

编译库文件编译库文件需要分为静态库和动态库两种情况进行说明。

静态库静态库是在链接时被完整地复制到可执行文件中的库文件。

使用静态库的优点是可执行文件独立于系统环境,可以在没有安装库文件的系统上运行,但可执行文件的体积较大。

编译静态库的步骤如下:1.编写源代码文件(例如example.c):#include <stdio.h>void hello() {printf("Hello, World!\n");}2.使用GCC编译源代码文件,生成目标文件(.o文件):gcc -c example.c -o example.o3.使用GCC将目标文件打包成静态库文件(.a文件):ar rcs libexample.a example.o其中,ar命令用于创建、修改和提取静态库文件,rcs选项分别表示创建库文件、添加目标文件和生成索引。

undefinedreferenceto问题解决方法

undefinedreferenceto问题解决方法

undefinedreferenceto问题解决⽅法"undefined reference to" 问题解决⽅法2016年01⽉18⽇ 14:30:26阅读数:1729最近在Linux下编程发现⼀个诡异的现象,就是在链接⼀个静态库的时候总是报错,类似下⾯这样的错误:1. (.text+0x13): undefined reference to `func'关于undefined reference这样的问题,⼤家其实经常会遇到,在此,我以详细地⽰例给出常见错误的各种原因以及解决⽅法,希望对初学者有所帮助。

1. 链接时缺失了相关⽬标⽂件(.o)测试代码如下:然后编译。

1. gcc -c test.c2. gcc –c main.c得到两个 .o ⽂件,⼀个是 main.o,⼀个是 test.o ,然后我们链接 .o 得到可执⾏程序:1. gcc -o main main.o这时,你会发现,报错了:1. main.o: In function `main':2. main.c:(.text+0x7): undefined reference to `test'3. collect2: ld returned 1 exit status这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现⽂件,本例中test.o⽂件中包含了test()函数的实现,所以如果按下⾯这种⽅式链接就没事了。

1. gcc -o main main.o test.o【扩展】:其实上⾯为了让⼤家更加清楚底层原因,我把编译链接分开了,下⾯这样编译也会报undefined reference错,其实底层原因与上⾯是⼀样的。

1. gcc -o main main.c //缺少test()的实现⽂件需要改成如下形式才能成功,将test()函数的实现⽂件⼀起编译。

cmakelistwindows创建和调用动态库,静态库

cmakelistwindows创建和调用动态库,静态库

cmakelistwindows创建和调⽤动态库,静态库// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / bstatic double Divide(double a, double b);};}// MathFuncsLib.cpp// compile with: cl /c /EHsc MathFuncsLib.cpp// post-build command: lib MathFuncsLib.obj#include "MathFuncsLib.h"#include <stdexcept>using namespace std;namespace MathFuncs{double MyMathFuncs::Add(double a, double b){return a + b;}double MyMathFuncs::Subtract(double a, double b){return a - b;}double MyMathFuncs::Multiply(double a, double b){return a * b;}double MyMathFuncs::Divide(double a, double b){return a / b;}}调⽤静态库// MyExecRefsLib.cpp// compile with: cl /EHsc MyExecRefsLib.cpp /link MathFuncsLib.lib#include <iostream>#include "MathFuncsLib.h"using namespace std;int main(){double a = 7.4;int b = 99;cout << "a + b = " <<MathFuncs::MyMathFuncs::Add(a, b) << endl;cout << "a - b = " <<MathFuncs::MyMathFuncs::Subtract(a, b) << endl;cout << "a * b = " <<MathFuncs::MyMathFuncs::Multiply(a, b) << endl;cout << "a / b = " <<// MathLibrary.h - Contains declaration of Function class#pragma once#ifdef MATHLIBRARY_EXPORTS#define MATHLIBRARY_API __declspec(dllexport)#else#define MATHLIBRARY_API __declspec(dllimport)#endifnamespace MathLibrary{// This class is exported from the MathLibrary.dllclass Functions{public:// Returns a + bstatic MATHLIBRARY_API double Add(double a, double b);// Returns a * bstatic MATHLIBRARY_API double Multiply(double a, double b);// Returns a + (a * b)static MATHLIBRARY_API double AddMultiply(double a, double b);};}// MathLibrary.cpp : Defines the exported functions for the DLL application.// Compile by using: cl /EHsc /DMATHLIBRARY_EXPORTS /LD MathLibrary.cpp #include "stdafx.h"#include "MathLibrary.h"namespace MathLibrary{double Functions::Add(double a, double b){return a + b;}double Functions::Multiply(double a, double b){return a * b;}double Functions::AddMultiply(double a, double b){return a + (a * b);}}调⽤动态库// MathClient.cpp : Defines the entry point for the console application.// Compile by using: cl /EHsc /link MathLibrary.lib MathClient.cpp#include "stdafx.h"#include <iostream>#include "MathLibrary.h"using namespace std;int main(){double a = 7.4;int b = 99;cout << "a + b = " <<MathLibrary::Functions::Add(a, b) << endl;cout << "a * b = " <<MathLibrary::Functions::Multiply(a, b) << endl;cout << "a + (a * b) = " <<。

VC++调用库文件(dll,lib)

VC++调用库文件(dll,lib)

1.静态库静态库实例:step1.在VC++6.0中new一个名称为libTest的static library工程,并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:编译这个工程在Debug目录下就得到了一个libTest.lib文件,这个文件就是一个函数库,它提供了add的功能。

将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

step2:下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。

新建libCall.cpp文件,它演示了静态链接库的调用方法,其源代码如下:代码中#pragma comment( lib , "..\\debug\\libTest.lib" )的意思是指本文件生成的.obj 文件应与libTest.lib一起连接。

如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。

图2中加红圈的部分为我们添加的libTest.lib文件的路径。

(此部分经测试,发现编译无法通过)2.动态库非MFC DLLVisual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC 编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

2.1 新建dll在VC++中new一个Win32 Dynamic-Link Library工程dllTest。

Linux下C语言函数库概述

总体概述,C语言的函数库可以有三种使用的形式:静态、共享和动态。

其中静态库的代码在编译时就已连接到开发人员开发的应用程序中。

而共享库只是在程序开始运行时才载入,在编译时, 只是简单地指定需要使用的库函数就可以了。

动态库则是共享库的另一种变化形式,它也是在程序运行时载入,但与共享库不同的是, 使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入,动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。

由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。

Linux下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

静态函数库:每次当应用程序和静态连接的函数库一起编译时,任何引用的库函数中的代码都会被直接包含进最终的二进制程序。

共享函数库:包含每个库函数的单一全局版本,它在所有应用程序之间共享。

这一过程背后所涉及的机制相当复杂,但主要依靠的是现代计算机的虚拟内存能力,它允许包含库函数的物理内存安全地在多个独立用户程序之间共享。

区分库类型最好的方法是看它们的文件后缀,通常共享库以.so(Shared Object的缩写)结尾,静态链接库通常以.a结尾(Archive的缩写)。

在终端缺省情况下,共享库通常为绿色,而静态库为黑色。

已经开发的大多数库都采取共享库的方式,Linux系统中目前可执行文件的标准格式为ELF(Executable and Linkable Format)格式。

ELF格式的可执行文件使得共享库能够比较容易地实现:.a的是为了支持较老的a.out格式的可执行文件,静态库文件, 可以用ar 命令生成。

.so的是支持elf格式的可执行文件的库,动态库文件,编译时加上指定的选项即可生成。

在linux系统中可用的库都存放在/usr/lib和/lib目录中。

linux下用gcc生成静态库和动态库

linux下用gcc生成静态库和动态库我们通常把一些公用函数制作成函数库,供其它程序使用。

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。

在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o 文件。

第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。

hello.h(见程序1)为该函数库的头文件。

main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。

#ifndef HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H程序1: hello.h#include <stdio.h>void hello(const char *name){printf("Hello %s!\n", name);}程序2: hello.c#include "hello.h"int main(){hello("everyone");return 0;}程序3: main.c第2步:将hello.c编译成.o文件;无论静态库,还是动态库,都是由.o文件创建的。

因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

在系统提示符下键入以下命令得到hello.o文件。

# gcc -c hello.c#我们运行ls命令看看是否生存了hello.o文件。

c语言生成库文件过程 -回复

c语言生成库文件过程-回复C语言是一种高级编程语言,被广泛用于系统级编程和嵌入式系统开发。

为了提高代码的复用性和模块化程度,C语言提供了生成库文件的机制。

本文将详细介绍C语言生成库文件的过程,以及相关的概念和步骤。

一、库文件的概念库文件是一种二进制文件,包含一组函数、变量或者数据结构的实现。

它将一些常用的代码封装成一个独立的单元,供其他程序调用和使用。

库文件可以被静态链接到程序中,也可以被动态链接到程序中。

1. 静态库(Static Library):静态库是将库文件的内容完全复制到程序中,程序在编译时需要将所有被引用的库文件的代码复制到最终生成的可执行文件中。

具体来说,静态库以归档(Archive)的形式存在,包含了一组目标文件(Object File)的集合。

静态库的文件名通常以“.a”(在GNU 编译器中)或“.lib”(在Windows中)结尾。

2. 动态库(Dynamic Library):动态库是在程序运行时被动态加载到内存中的库文件,程序在编译时只需要引用库函数的签名,无需复制库文件中的代码。

不同的程序可以共享同一个动态库的实例,有效减小可执行文件的体积。

动态库的文件名通常以“.so”(在Unix/Linux中)或“.dll”(在Windows中)结尾。

在使用库文件时,程序需要链接器(Linker)的支持,将库文件的代码和程序的代码进行整合,生成最终的可执行文件。

二、生成静态库的过程下面将介绍生成静态库的过程,以GNU编译器为例。

1. 编写源代码首先,需要编写一组实现某些功能的源代码文件。

这些源代码文件可以包含函数的定义、变量的声明和实现,以及相关的头文件。

2. 编译为目标文件使用编译器将源代码文件编译为目标文件(Object File)。

目标文件是二进制文件,包含了源代码文件的机器代码表示和一些符号表信息。

使用gcc 命令可以进行编译,例如:gcc -c file1.c file2.c这将生成`file1.o`和`file2.o`两个目标文件。

利用C语言创建和使用DLL文件

利⽤C语⾔创建和使⽤DLL⽂件有感于讲C语⾔的DLL⽂件的⽂章很少,⾃⼰查了半天,写了这么个⾮常简单的教程。

⾃⼰也是摸C语⾔不久,依然感觉处于编程苦⼿的阶段。

1)为什么使⽤DLL⽂件C语⾔复⽤代码有很多的形式,利⽤动态链接库(DLL)来复⽤代码也是⼀种很有效的做法。

使⽤DLL相⽐利⽤静态库来复⽤代码有⼏点不同:a. 可以不⽤写 header File,但是在编译过程中需要在编译器⾥把⽂件链接起来;b. 更加灵活,可以只改动和编译DLL⽂件的内容,⽽不⽤对程序其他部分进⾏修改;c. 利⽤DLL⽂件可以⽅便地与其他语⾔进⾏链接(⽐如Python)。

2)创建DLL及C语⾔调⽤程序⽬前看来,创建 DLL ⽂件和创建普通c语⾔⽂件没有什么不同。

创建 C++ 的 DLL ⽂件要更复杂⼀些,C 则相对简单。

照着 C 代码的格式写⼀个⽂件(注:C++ 似乎会不同,微软就有教程,可以查阅VS的帮助⽂档)。

以下是⼀个实例,⽂件名为 TestDll.c//TestDll.c#include<</font>stdio.h>int hello(){printf ("Hello from DLL\n");}int SumNumbers(int a, int b){int c;c=a+b;return c;}然后写⼀个主程序来调⽤,⽂件名为 UseTestDll.c//UseTestDLL.c#include<</font>stdio.h>int main(){hello();hello();int a=2,b=3;int c;c=SumNumbers(a, b);printf ("c= %d.\n",c);}搞定。

3)编译及运⾏测试使⽤的是 MinGW 下的 gcc 编译器。

a. 编译 DLL ⽂件先将 c ⽂件编译成 o ⽂件,然后再讲 o ⽂件编译成为 DLL ⽂件,在 cmd ⾥⾯代码如下:gcc -c TestDLL.cgcc -shared -o TestDll.dll TestDll.o这样就得到了 TestDll.dll ⽂件,如果⽂件多的话可以写个Batch⽂件来搞定。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++创建和使用静态库的方法
我的使用的编译工具GNU MingW的g++ 、打包工具ar.
如果你不懂什么是静态库,我只能说他的后缀名是.a,这是可以使用打包工具生成的一个文件,这是一些中间目标文件的打包,当你想把你的方法与他人分享,但不希望其他人知道他的源码是什么的时候,你就可以这样做,其的中间目标文件拷贝给他,但是一旦这些中间目标文件比较多时,我们就把他打包成静态库。

于是我在这里自己生成一个静态库,来做这个事情。

首先我编写一个头文件,test.h
//test.h
class test{
public :
void f1();
};
//接着我实现这个头文件的f1()方法,并其生成静态库文件.a文件。

//testlib.cpp
#include<iostream>
using namespace std;
#include"test.h"
void test::f1(){
cout<<"hello!"<<endl;
}
接下来是我操所
1、编译这个文件生成中间目标文件。

工具:g++
参数:-o 这个文件是这样工作的
编译或汇编源文件, 生成目标文件(.o), 但不做连接. 这个选项同时也会使gcc 忽略-c后面无法识别的文件.(它们不需要编译或汇编)
g++ -c testlib.cpp
这样就会生成testlib.o文件,之后我用这个打包成静态库
2、打包这个中间目标文件:
工具:ar
参数:-r
ar–r testlib.atestlib.o
于是生成静态库文件testlib.a
//最后我写一个主函数实现这个类,实例化这个类,但我不同是我使用哭文件来连接程序。

这样一来中间的实现过程是可以隐藏的了。

//main.cpp
#include"test.h"
int main(){
test t;
t.f1();
return 0;
}
现在我开始编译他:
工具:g++
参数:-o
●-o filename

●指定输出文件为filename. 该选项不在乎GCC要产生什么输出, 无论是可执行
文件, 目标文件, 汇编文件, 还是预处理后的代码. 如果没有-o选项, 默认的输
出:
●可执行文件: a.out

●目标文件: source.suffix生成source.o

●汇编文件: source.suffix生成source.s
g++ -o test main.cpp testlib.a
结果:生成一个test.exe文件,在命令行下就可以看到hello!字符串了。

参考文章:/dai_weitao/article/details/1765785
后记:希望大家能积极的提出我的错误,留言更正。

我会尽我最大的努力完善这篇文章,谢谢!。

相关文档
最新文档