当前位置:首页 » 编程软件 » gcc编译静态库

gcc编译静态库

发布时间: 2022-01-15 00:46:09

① GCC怎样进行静态编译

-static 前提是GTK提供了静态库否则没戏
a有可能是导出库,先编译 再检查依赖 用Dependency Walker 缺啥 打包啥

② 简述gcc编译时使用静态库和动态库的区别

函数库分为静态库和动态库两
种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态
库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运
行时还需要动态库存在。

linux 如何使用GCC编译器将一个文件夹下的100个.o文件打包成一个静态库文件(.a)

你已经用gcc编译出目标文件了,用ar工具打包成.a文件就行了啊,示例:


如上图,假设我有test1.c,test2.c两个源文件,先使用gcc -c *.c将源文件编译成目标文件,可以看到,生成了test1.o,test2.o两个目标文件,然后,使用ar命令:ar crv libtest.a *.o将该目录下的所有目标文件打包生成了libtest.a文件。这样,你在编译的时候就可以直接使用这个静态库了。

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

如何编译动态库
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下如何使用GCC编译程序、简单生成 静态库及动态库

一个程序调用了一个动态库,但是两者之间有函数重名,导致运行时动态库中的Linux下动态库文件的扩展名为这样,线程函数库被称作libthread.so。静态库的

⑥ 如何使用GCC生成动态库和静态库

下面以工程libtest为例说明gcc创建和使用静态库、动态库的过程,libtest目录结构和内容如图1所示,其中三个文件hello.h,hello.c和main.c的内容如下。

libtest/include/hello.h

#ifdef _HELLO_H_
#define _HELLO_H_
void hello();
#endif
libtest/lib/hello.c
#include "hello.h"
#include <stdio.h>
void hello()
{
printf("hello world!\n");
}
libtest/src/main.c
#include "hello.h"
int main()
{
hello();
}

静态库过程如下:
(1) 进入libtest/lib目录,执行命令:
gcc -c -I../include hello.c
该命令生成目标文件hello.o,注意:参数-I添加头文件搜索目录,这里因为hello.c中有#include “hello.h”,hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则出现错误提示“找不到头文件hello.h”。
这一步将在libtest/lib目录中生成一个hello.o文件。
(2) 在libtest/lib目录,执行命令:
ar rc libhello.ahello.o
该命令将hello.o添加到静态库文件libhello.a,ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库
这一步将在libtest/lib目录中生成一个libhello.a文件。
(3) 进入libtest/src目录,执行命令:
gcc main.c-I../include -L../lib -lhello -o main
该命令将编译main.c并链接静态库文件libhello.a生成可执行文件main,注意:参数-L添加库文件搜索目录,因为libhello.a在libtest/lib目录中,这里需要指定该目录通知gcc,参数-l指定链接的库文件名称,名称不用写全名libhello.a,只用写hello即可。
这一步将在libtest/src目录中生成可执行文件main。

动态库过程如下:
(1) 进入libtest/lib目录,执行命令:
gcc hello.c-I../include -fPIC -shared -o libhello.so
这一步将在当前目录生成动态库文件libhello.so,参数-fPIC -shared固定格式,不用纠结他们什么意思。
(2) 进入libtest/src目录,执行命令:
gcc main.c-I../include -L../lib -lhello -o main
此时在当前目录中已经生成了可执行文件main,执行./main时却提示错误:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory
也就是找不到动态库文件libhello.so,在网上找了答案说如果遇到这样的问题需要设置环境变量LD_LIBRARY_PATH,如下:
export LD_LIBRARY_PATH=”../lib”
gcc main.c -I../include -L../lib -lhello -o main
然后再执行./main就没有错误了。
【补充】
环境变量LD_LIBRARY_PATH指示动态连接器可以装载动态库的路径,在链接动态库文件前设置该变量为库文件所在路径,注意:用export LD_LIBRARY_PATH=”…”方式只是临时生效的,如果要永久有效可以写入~/.bashrc文件中,跟修改PATH类似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。
当然如果有root权限的话,也可以修改/etc/ld.so.conf文件,将要添加的动态库搜索路径写入该文件中,然后调用/sbin/ldconfig来达到同样的目的。

⑦ 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

⑧ Linux 中,在使用g++编译、连接程序时,怎样调用多个静态库文件

在编译命令行中,将使用的静态库文件放在源文件后面就可以了。比如:
gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
其中-L/usr/lib指定库文件的查找路径,编译器默认在当前目录下先查找指定的库文件。

⑨ g++如何链接gcc生成的静态库文件

g++直接链接gcc生成的静态库文件,会出现以下错误:
[search@SY-0187 test]$ g++ test.cpp -o test -L. -lmyhelloc
/tmp/cc83gjbt.o: In function `main':
test.c:(.text+0x5): undefined reference to `hello()'
collect2: ld returned 1 exit status
找不到静态库中的函数,原因是:
c++的函数名的生成和c的函数名的生成不同,在c中只根据函数名和调用约定、c++还要加上参数类型列表,所以c++编译器无法找到函数。
解决办法:只要用extern “C” 告诉编译器使用c语言的函数名字修饰技术就可以了。
解决方法:
1.在cpp文件的include处,对c库函数前加上 extern “C”extern C{#include ../lib/libxxx.h}不推荐,原因是会出现以下错误:
[search@SY-0187 test]$ g++ -g get_value.cpp -o get_value -I./include -L./lib -lMymemcached -lmemcached
/usr/local/include/libmemcached/options.h:69: error: declaration of C function 'memcached_return_t memcached_parse_configure_file(memcached_st*, memcached_array_st*)' conflicts with
/usr/local/include/libmemcached/options.h:66: error: previous declaration 'memcached_return_t memcached_parse_configure_file(memcached_st*, const char*, size_t)' here
不能识别重载的函数。
2.对.a include
的头文件进行修改。
#ifdef __cplusplusextern C{#endif原先的.a的库函数的声明
#ifdef __cplusplus}#endif推荐使用这种方式
标准的C的头文件形式是:

热点内容
保存在服务器的图片如何删除 发布:2024-11-15 09:55:09 浏览:801
花雨庭国际服服务器ip 发布:2024-11-15 09:54:00 浏览:503
服务器的空岛如何刷钱 发布:2024-11-15 09:40:52 浏览:263
安卓系统录像设置在哪里 发布:2024-11-15 09:36:33 浏览:917
电信级服务器电脑 发布:2024-11-15 09:26:27 浏览:246
压缩某个文件夹 发布:2024-11-15 09:03:11 浏览:891
网址能解压吗 发布:2024-11-15 08:54:09 浏览:933
python更改目录 发布:2024-11-15 08:41:08 浏览:265
服务器闪存可以装在一般电脑上吗 发布:2024-11-15 08:36:46 浏览:8
安卓手机怎么查询自己的路线轨迹 发布:2024-11-15 08:32:19 浏览:969