gcc编译动态链接库
⑴ 包含unistd.h gcc编译应该链接什么库
生成动态链接库的命令行为:gcc -fPIC -shared -o libstr.so当将main.c和动态链接库进行连接生成可执行文件 的命令如下:gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr测试是否动态链接,如果列出libstr.so, 那么应该是连接正常了ldd main注:1)-L.:表示连接的库在当前的目录中。
⑵ 在linux中,怎么用gcc编译文件
在终端中输入 gcc 文件名 -o 目标文件名
然后 ./目标文件名 就行了,没有目标文件名,自动存为 a
执行 ./a 就行了。
在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include <myinc.h>
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。
GCC执行过程示例
示例代码 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
预编译过程:
这个过程处理宏定义和include,并做语法检查。
可以看到预编译后,代码从5行扩展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
编译过程:
这个阶段,生成汇编代码。
gcc -S a.i -o a.s
cat a.s | wc -l
59
汇编过程:
这个阶段,生成目标代码。
此过程生成ELF格式的目标代码。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
链接过程:
链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
gcc a.o -o a
程序运行:
./a
hello
编辑本段
GCC编译简单例子
编写如下代码:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
执行情况如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!
⑶ LLINUX GCC 编译C使用自定义动态链接库.so的问题
1. 可以参考如下关于库文件的文章:http://numanal.com/?p=129
2. 在编译文件时最好用-L指明自定义库的存在目录, 利用如下任一语句(.so文件与.c文件在同一目录):
gcc test.c -o test2 -L./verify.so
gcc test.c -o test2 -L.
3. 你这里在的问题应该与编译器的某些兼容性有关, 在实际编写程序的时候最好按gcc的语法规范走, 避免不必要的错误.
⑷ 如何用gcc编译生成动态链接库*.so文件
生成动态链接库的命令行为:
gcc -fPIC -shared -o libstr.so
当将main.c和动态链接库进行连接生成可执行文件 的命令如下:
gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr
测试是否动态链接,如果列出libstr.so, 那么应该是连接正常了ldd main注:1)-L.:表示连接的库在当前的目录中。
⑸ 有个 c 文件,如何才能将其编译成动态链接库
有二个文件,一个 test.h, 一个 test.c
//test.h
#pragmaonce
#ifdef__cplusplus
extern"C"{
#endif
intadd(inta,intb);
#ifdef__cplusplus
}
#endif
//test.c
#include"test.h"
intadd(inta,intb)
{
returna+b;
}
编译,生成动态链接库:
#gcc-g3-Wall-fPIC-shared-olibtest.sotest.c
#ls-l
-rwxr-xr-x1rootroot14618Jul2413:44libtest.so
-rw-r--r--1rootroot63Jul2413:43test.c
-rw-r--r--1rootroot106Jul2413:43test.h
#nmlibtest.so
00000000002006e8a_DYNAMIC
0000000000200890a_GLOBAL_OFFSET_TABLE_
w_ITM_deregisterTMCloneTable
w_ITM_registerTMCloneTable
w_Jv_RegisterClasses
00000000002006c8d__CTOR_END__
00000000002006c0d__CTOR_LIST__
00000000002006d8d__DTOR_END__
00000000002006d0d__DTOR_LIST__
00000000000006b8r__FRAME_END__
00000000002006e0d__JCR_END__
00000000002006e0d__JCR_LIST__
00000000002008b8d__TMC_END__
00000000002008b8A__bss_start
w__cxa_finalize@@GLIBC_2.2.5
0000000000000620t__do_global_ctors_aux
0000000000000550t__do_global_dtors_aux
00000000002008b0d__dso_handle
w__gmon_start__
00000000002008b8A_edata
00000000002008c8A_end
0000000000000658T_fini
0000000000000468T_init
0000000000000600Tadd
00000000000004a0tcall_gmon_start
00000000002008b8bcompleted.6557
00000000000004c0tderegister_tm_clones
00000000002008c0bdtor_idx.6559
00000000000005d0tframe_mmy
0000000000000500tregister_tm_clones
⑹ c语言怎么编写动态链接库
编写动态链接库的过程
其实和编写普通C程序差不多少
只不过
把一个整体的C程序,摘出来一部分, 放在独立的一个或者几个C文件中
再把这些C文件打包成dll或者so文件而已。
所以写法上没有特别的
需要注意的是编译。
如果是windows,最好用IDE,创建的时候选动态链接库
如果是gcc, 那么编译的时候 增加编译选项 -fPIC -shared即可。
⑺ gcc头文件包含,动态链接库
1、包含哪个头文件,需要查询程序使用库的SDK说明文档,比如printf(),它的函数声明在stdio.h头文件中,因此要使用printf(),必须在开头加上一句:
#include <stdio.h>
2、动态链接库,这个是从静态链接库发展而来的,所谓库即很多程序都会使用的代码,因此程序员提取出来,称之为库,最早的库是静态库,所谓静态即表示在生成可执行文件的链接阶断,链接器会将程序所需要的库文件,和程序的文件一起打包为一个文件。这会使得应用程序很大,不仅不利于存储而且操作系统加载时也会耗费时间,因此才引入了动态库,动态库只会在链接阶断生成程序时,加入一小段数据,用于描述此程序使用了哪此库,使用了库中的哪些函数,以及这些函数的虚拟内存地址。
⑻ gcc 引用math 库 编译的问题
gcc 引用math 库 编译的问题
解决方法:gcc app.c -lm其中lm表示的是连接m forlibm.so / libm.a表示你想要的库
abc for libabc.so / libabc.a其中.a表示的是静态链接库.
so表示的是动态链接库。