当前位置:首页 » 编程软件 » 怎么编译库

怎么编译库

发布时间: 2022-01-23 21:55:57

Ⅰ 如何编译生成和调用静态库

如何编译动态库
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用动态库
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要库的路径
-l:表示需要库的名称,如libtest.so,名称则为test
)
(ps:执行a.out时有可能提示找不到libtest.so文件,这时需要把库文件放入到/lib等目录下,或者添加环境变量LD_LIBRARY_PATH,包含有库文件的路径即可)

如何编译静态库
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用静态库
gcc main.c -static -L. -ltest -o a.out

-static:可强制编译时使用静态库,如果不使用这个参数,而静态库与动态库同名的话,会优先使用动态库

linux静态库怎么编译

linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so
libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:
libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc
-c
hello.c
-o
hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立两个符号连接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc
-shared
参数使其生成是动态库而不是普通执行程序。
-wl
表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有
soname名字的文件,%b

Ⅲ 怎么才能将C语言程序,编译成可执行文件,需要什么库和文件,怎么建立库和文件

需要C语言运行的环境,比如Microsoft Visual C++ 6.0,然后写入可执行的文件,一般的简单函数只需要<stdio.h>

Ⅳ 如何将源文件编译成库文件

问题说的不是很清楚!
如果你是希望你编的函数能像库函数那样直接调用的话
可以把你的函数放到一个文件里
如果以后你那个程序需要这些函数时直接包含该文件就行了
像使用头文件那样#include"myfile.c"( 注意这里是用双引号)
然后在你程序中就可以直接调用你自定义的函数了

如果我理解题目错误,敬请原谅!

【原创答人】

Ⅳ 怎样编译加载共享库的可执行程序

1.下载FatJar插件2.安装之后,右键选择项目时,会出现BuildFatJar,选择该方法,然后按照向导即可一步步导出可执行jar文件。如果有外部的jar包,比如说sqljdbc.jar,则把所有要使用的第三方的jar包都复制到{java_home}\jre\lib\ext目录下。(必须重新启动Eclipse才能加载这些jar包)而象SWT项目这样所使用的jar包,则不需要这么设置,直接在向导中选择所需要的jar包即可。3.然后就可以在导出目录中运行这个可执行jar包,但如果是SWT项目,则必须在包含该可执行jar包的目录下有一个swt-win32-3235.dll之类的文件。4.有了可执行的jar文件,然后可以使用exe4j.exe之类的jar转exe软件,如果使用exe4j.exe则当调用到sqljdbc.jar之类的外部包时,则必须将sqljdbc.jar也一并导入。安装向导就可以生成exe文件了,如果是SWT项目则也必须在同目录下有swt-win32-3235.dll之类的文件。

Ⅵ 如何在源码编译中增加第三方库

很多时候在开发APK的时候需要调用加载调用独立的第三方库文件 下面举例如何在应用中添加

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_STATIC_JAVA_LIBRARIES := libammsdk //随便起的第三方库别名
LOCAL_PACKAGE_NAME := wechat_sdk_sample_android
include $(BUILD_PACKAGE)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libammsdk:libs/libammsdk.jar
//libammsdk:libs/libammsdk.jar是给libs/libammsdk.jar起别名,但是必须和LOCAL_STATIC_JAVA_LIBRARIES中的名称一致
include $(BUILD_MULTI_PREBUILT)

Ⅶ c++库使用前要编译但有些库windows下不知道如何编译

有些源代码是平台相关的,只能在linux下编译,因为使用了linux特有的头文件和系统调用。

Ⅷ 在TC中,怎样用命令编译lib库

定义函数库的方法及应用:

一、2个相关的命令

1、TCC——TC的DOS下的命令行编译连接工具
2、TLIB——TC的DOS下的库操作工具

二、1个自定义的函数库的例子

1、 在TC集成环境下,编一个文件USERADD.C
#define _NO_MAIN
int add(int *a,int *b)
{ int c;
c=(*a)+(*b);
return c;
}
按ALT—F9编译 生成一个 USERADD.OBJ文件。

2、按F10—F—O 退到DOSSHELL(DOS环境下)
COPY USERADD.OBJ 到 ..\LIB目录,在\LIB目录下执行
TLIB USERLIB.LIB+USERADD.OBJ 就生成了一个自己的函数库 USERLIB,在这个函数库里就包含了函数模块 int add(int *a,int *b) 的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件USERADD.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。 以后如有其它的函数模块,也可以编译后用TLIB 命令加入到这个函数库里。

3、写一个包含文件 USER1.H,写完后COPY到INCLUDE 目录。内容如下:
int add(int *,int *);

4、作好了以上的自定义函数库的准备工作,现在就可以使用了。
写一个程序,取名为ADD-1.C,在程序中调用库函数add( );
#include<stdio.h>
#include<user1.h>
void main( )
{
int a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(“%d”,c);
}

5、在DOS命令行下,执行 TCC ADD-1.C ..\LIB\USERLIB.LIB 就OK!
运行ADD-1.EXE,可以看到输出结果 50
Tc生成lib的方法:
扩展库与自建LIB库使用扩展库TC所带的库在有的情况下是无法满足功能要求的,自己写一个太麻烦,找到了一个LIB库又怕不会用。在WIN-TC中,对于使用外部的扩展库(第三方LIB)提供了一个方便的解决方法:首先要确定你的LIB库是FOR TC版本的而不是FOR VC或是其它的。如果确定是FOR TC的版本的话就把你的首标文件(或称头文件),就是扩展名为*.h的文件拷贝到WIN-TC的include目录里,然后把相应名称的*.lib文件拷贝到lib目录,然后再运行WIN-TC时选择“编译配置”菜单项,你会看到扩展库信息栏目里有你的LIB库文件名在上面了,但是没有打钩。然后你把它钩选后再“确定”保存,以后的编译程序时就自动链接该扩展库了。自建立LIB库将自己的代码编译成LIB库的格式有利与保护自己的代码版权。如何来生成自己的LIB库呢?请按照下面的方法:
STEP 1——生成目标代码(OBJ) 建立mylib的代码文件/********************* mylib.c *********************/void myfun(){printf("
myfun() in mylib.lib
");}然后保存为WIN-TC目录下的mylib.c文件然后到菜单项:运行->编译设置 看看“产生 OBJ 文件”是否已选择,若未选择则选择之。然后回到主界面,点“编译链接”按钮(F9)STEP 2——建立LIB库(LIB)将WIN-TC目录下生成的mylib.obj文件拷贝至WIN-TC的BIN目录,然后在该目录下用记事本建立一批处理文件makelib.bat,内容如下:Tlib mylib.lib +mylib.obj然后双击运行,则在BIN目录下生成了mylib.lib库文件。至此,你会觉得胜利开始向你招手了,不过你必须按部就班完成剩下的任务才能达到使用自建LIB库的最终目标。STEP 3——建立首标文件(*.h)并使用LIB库将BIN目录下的mylib.lib拷贝至WIN-TC的lib目录。然后打开WIN-TC的菜单:运行->编译配置你会看到“扩展库信息”列表里面有你生成的mylib.lib了,不过没有打钩,将它单击钩选,以后编译时就可以自动链接该库了。剩下的时就是建立首标文件了,用WIN-TC新建一文件,里面只需要写一句话:void myfun();如果担心反复引用的话,可以加上#ifndef #define #endif的结构,例如将以上结构用__MYLIB1来避免反复引用写为:#ifndef __MYLIB#define __MYLIBvoid myfun();#endif然后“保存”,在弹出的保存对话框里面的保存类型里选择最下面的头文件(*.h),保存位置为WIN-TC的INCLUDE目录,文件名要与建立的库一致既为mylib。如果顺利的话,在INCLUDE目录下将可以看到一个mylib.h文件。至此,你已经按照步骤建立了LIB库并完成了WIN-TC的相关设置,接下来将检验自己的劳动成果了。STEP 4——测试自己的LIB库新建测试文件如下:#include "mylib.h" /*包含自定义库的头文件*/main(){myfun();getch();}激动人心的时刻到了(如果你是第一次做自己的库会有这种感觉的),使用用Ctrl+F9编译运行之,如果成功的话,你将会看到下面的屏幕输出:myfun() in mylib.lib如果出现错误信息的话,你再检查一下你自己是否是严格按照步骤生成并使用的LIB库需要注意一下:由于DOS路径长度的限制,同时使用(钩选)的根据路径长短最多可以同时支持10个!

Ⅸ 如何用gcc编译动态库

今天要用到静态库和动态库,于是写了几个例子来巩固一下基础。
hello1.c ————————————————————
#include <stdio.h>
void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); } }
hello2.c _________________________________________________
#include <stdio.h>
void print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }
hello.c ____________________________________________________
void print1(int); void print2(char *);
int main(int argc,char **argv) { int i=100; char *arr="THIS IS LAYMU'S HOME!"; print1(i); print2(arr);
return 0; }

可以看到hello.c要用到hello1.c中的print1函数和hello2.c中的print2函数。所以可以把这两个函数组合为库,以供更多的程序作为组件来调用。

方法一:将hello1.c和hello2.c编译成静态链接库.a
[root@localhost main5]#gcc -c hello1.c hello2.c
//将hello1.c和hello2.c分别编译为hello1.o和hello2.o,其中-c选项意为只编译不链接。
[root@localhost main5]#ar -r libhello.a hello1.o hello2.o
//将hello1.o和hello2.o组合为libhello.a这个静态链接库
[root@localhost main5]#cp libhello.a /usr/lib
//将libhello.a拷贝到/usr/lib目录下,作为一个系统共享的静态链接库
[root@localhost main5]#gcc -o hello hello.c -lhello
//将hello.c编译为可执行程序hello,这个过程用到了-lhello选项,这个选项告诉gcc编译器到/usr/lib目录下去找libhello.a的静态链接库
以上的过程类似于windows下的lib静态链接库的编译及调用过程。
方法二:将hello1.o和hello2.o组合成动态链接库.so
[root@localhost main5]#gcc -c -fpic hello1.c hello2.c
//将hello1.c和hello2.c编译成hello1.o和hello2.o,-c意为只编译不链接,-fpic意为位置独立代码,指示编译程序生成的代码要适合共享库的内容这样的代码能够根据载入内存的位置计算内部地址。
[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so
//将hello1.o和hello2.o组合为shared object,即动态链接库
[root@localhost main5]#cp hello.so /usr/lib
//将hello.so拷贝到/usr/lib目录下
[root@localhost main5]#gcc -o hello hello.c hello.so
//将hello.c编译链接为hello的可执行程序,这个过程用到了动态链接库hello.so

在这里要废话几句,其实一切的二进制信息都有其运作的机制,只要弄清楚了它的机制,并能够实现之,则任何此时此刻无法想象之事都将成为现实。当然,这两者之间的巨大鸿沟需要顶级的设计思想和顶级的代码来跨越。

Ⅹ linux下如何手动编译安装bzip2库

下载bzip2 下载地址:http://www.bzip.org/downloads.html
1>格式是*.tar.gz 解压文件
tar -zxf bzip2-1.0.6.tar.gz 得到一个bzip2-1.0.6目录
2>进入bzip2-1.0.6目录
cd bzip2-1.0.6 //目录视文件存放路径而定
3>make -f Makefile-libbz2_so //-f 标志是使bzip2 根据另一个Makefile来编译,就是Makefile-libbz2_so文件,创建一个动态的libbz.so库文件,然后把bzip2工具连接到这个库上
注:装python的时候如果没有这一步,python安装不上bz2模块
4>make && make install 此命令执行成功,就安装完了
注:如果要重新安装bzip2,要先执行:rm -vf /usr/bin/bz* 命令,不然make install 命令会失败

热点内容
三星存储器已几乎满 发布:2024-05-04 22:47:38 浏览:735
mf90pos机密码是什么 发布:2024-05-04 22:24:04 浏览:750
编译预处理和函数区别 发布:2024-05-04 22:16:49 浏览:431
java复选框 发布:2024-05-04 22:13:24 浏览:529
安卓怎么玩页游 发布:2024-05-04 22:03:17 浏览:142
编译器后面的代码消失 发布:2024-05-04 22:02:11 浏览:61
openwrt编译ipk 发布:2024-05-04 22:00:25 浏览:830
管理云服务器 发布:2024-05-04 21:36:31 浏览:553
给linux虚拟机传文件 发布:2024-05-04 21:36:28 浏览:314
加密手机在哪里 发布:2024-05-04 21:18:59 浏览:191