linux编译静态块命令 linux静态库的生成与使用

linux命令gcc–static式什么意思gcc 空格 -static 吧?
-static 是让 gcc 进行静态编译,也就是把所有都需要的函数库都集成进编译出来的程序上,这个程序就可以不依赖外部的函数库运行了 。
linux a 静态库 怎么设置Linux的静态库文件并不需要设置啊 , 编译链接.a静态库文件时只需要加上.a文件的完整路径就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
只有编译链接动态库才需要用-L选项来设置动态库的搜索路径,比如这个命令:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto
在linux环境下静态库(.a)的编译和使用假设我们自己编译一个加法程序,和打印程序 。
那么我们可以通过下面两个命令将这两个函数编译成静态库 。
那么我们可以通过下面的命令(任选一种)将main.cpp与静态库进行编译 。
待后续补充
linux怎么静态编译关于在 Linux 环境下面对 C 语言源程序进行静态编译linux编译静态块命令,关键是要看你的 C 语言源程序中都使用到了哪些系统库函数?如果是标准的输入、输出库函数,只要在命令行提示符 $ 下面执行linux编译静态块命令:
gcc my_prog.c 即可(缺省的可执行文件名是:a.out)linux编译静态块命令;如果在用户的源程序中使用到了数学计算函数,那么在命令行提示符 $ 下面必须执行:
gcc my_prog.c -IMATH.LIB(假设涉及到各种数学计算的数学库的库文件为:MATH.LIB)
如果不加上 -IMATH.LIB 选项,那么即使你的源程序编写得再正确 , 也无法正常编译 。
另外还有一个必须要注意的就是:在 Linux 的环境变量中,一定要把 INCLUDE、LIB 所在的路径设置好(在 SHELL 文件中写好),这样在使用 Linux 系统时才能够减少出错的机会 。
Linux动态链接和静态链接简析linux动态链接和静态链接简析1.生成静态链接库gcc
-c
h.c
-o
h.oar
cqs
libh.a
h.o//ar是生成库的命令,cqs是参数,libh.a是生成的静态链接库须以lib开头,h是库名,a表示是静态链接库,h.o是刚才生成目标文件2.生成动态链接库
gcc
-c
h.c
-o
h.o生成动态链接库用gcc来完成gcc
-shared
-WI
-o
libh.so
h.o//-shared
-WI是参数,libh.so是生成的静态链接库须以lib开头 , h是库名,so表示是动态链接库,h.o是刚才生成目标文件3.将生成的libh.a,libh.so拷贝到/usr/lib或/lib下4.编译带静态链接库的程序gcc
-c
test.c
-o
test.ogcc
test.o
-o
test
-WI
-Bstatic
-lh//-WI
-Bstatic表示链接静态库,-lh中-l表示链接,h是库名即/usr/lib下的libh.a5.编译带动态链接库的程序gcc
-c
test.c
-o
test.ogcc
test.o
-o
test
-WI
-Bdynamic
-lh//-WI
-Bdynamic表示链接动态库,-lh中-l表示链接,h是库名即/usr/lib下的libh.so6.运行./test得到结果
7.其他知识有些库形如libh.so.1.0,1.0表示版本号.若要使用该库 , 通常要建立一个软连接,用ln
-s
libh.so.1.0
libh.so.系统不知道1.0为何意思 。编译连接时同时要用动态和静态链接库,则用如下命令gcc
test.o
-o
test
-WI
-Bstatic
-lh1
-WI
-Bdynamic
-lh28.动态库和静态库的位置问题把动态库或者静态库放在/usr/lib或者/lib下,在链接的时候系统会自动到这两个目录下寻找 。如果没有放在这两个目录下,则修改/etc/ld.so.conf文件,把目录写入该文件 , 然后ldconfig,就OK了 。如果没有放在usr/lib或者/lib目录下,也不修改/etc/ld.so.conf文件,也可以在编译的时候加上
-L/路径
也可以 。但是在执行的时候还是会提示找不到库的所在 。
作者
llg521208
如何编译一个linux下的驱动模块首先 , 我们要了解一下模块是如何别被构造的 。模块的构造过程与用户空间
的应用程序的构造过程有显著不同;内核是一个大的、独立的程序
,
对于它的各
个部分如何组合在一起有详细的明确的要求 。
Linux2.6
内核的构造过程也与以
前版本的内核构造过程不同;
新的构造系统用起来更加简单,
并且可产生更加正
确的结果
,
但是它看起来和先前的方法有很大不同 。内核的构造系统非常复杂
,
我们所看到的只是它的一小部分 。
如果读者想了解更深入的细节 ,
则应阅读在内
核源码中的
Document/kbuild
目录下的文件 。
在构造内核模块之前,
有一些先决条件首先应该得到满足 。
首先,
读者要保证你
有适合于你的内核版本的编译器、模块工具
,
以及其他必要工具 。在内核文档目
录下的文件
Documentation/Changes
里列出了需要的工具版本;
在开始构造内
核前,
读者有必要查看该文件,
并确保已安装了正确的工具 。
如果用错误的工具
版本来构造一个内核
(
及其模块
)
,可能导致许多奇怪的问题 。另外也要注意
,
使
用太新版本的编译器偶尔可能也会导致问题 。
一旦做好了上面的准备工作之后
,
其实给自己的模块创建一个
makefile
则非常
简单 。实际上
,
对于本章前面展示的
" hello world"
例子
,
下面一行就够了
:
obj-m := hello.o
如果读者熟悉
make

但是对
Linux2.6
内核构造系统不熟悉的话
,
可能奇怪这个
makefile
如何工作 。毕竟上面的这一行不是一个传统的
makefile
的样子 。问
题的答案当然是内核构造系统处理了余下的工作 。上面的赋值语句
(
它利用了由
GNU make
提供的扩展语法
)
说明有一个模块要从目标文件
hello.o
构造,而从
该目标文件构造的模块名称为
hello.ko.
如果我们想由两个源文件
(
比如
file1.c

file2.c )
构造出一个名称为
module.ko
的模块
,
则正确的
makefile
可如下编写
:
obj-m := module.o
module-objs := file1.o file2.o
为了让上面这种类型的
makefile
文件正常工作
,
必须在大的内核构造系统环境
中调用他们 。假设读者的内核源码数位于
~/kernel-2.6
目录
,
用来建立你的模
块的
make
命令
(
在包含模块源代码和
makefile
的目录下键入
)
应该是
:
make -C ~/kernel-2.6 M=`pwd` modules
这个命令首先是改变目录到用
-C
选项指定的位置
(
即内核源代码目录
)
,其中保
存有内核的顶层
makefile
文件 。这个
M=
选项使
makefile
在构造
modules

标前
,
返回到模块源码目录 。
然后,
modules
目标指向
obj-m
变量中设定的模块,
在上面的例子里,我们将该变量设置成了
module.o

上面这样的
make
命令对于多个文件的编译显得不是很方便
,
于是内核开发者就
开发了一种
makefile
方式
,
这种方式使得内核树之外的模块构造变得更加容易 。
代码清单
1.4
展示了
makefile
的编写方法:
代码清单
1.4 makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /source/linux-2.6.13
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*. *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
else
obj-m := hello.o
endif
我们再次看到了扩展的
GNU
make
语法在起作用 。在一个典型的构造过程中,这

makefile
将被读取两次 。当从命令行中调用这个
makefile ,
它注意到
KERNELRELEASE
变量尚未设置 。我们可以注意到,已安装的模块目录中存在一
个符号连接 ,
它指向内核的构造树,
这样这个
makefile
就可以定位内核的源代
码目录 。如果读者时间运行的内核并不是要构造的内核 , 则可以在命令行提供
KERNELDIR=
选项或者设置
KERNELDIR
环境变量
,
或者修改
makefile
中设置
KERNELDIR
的那一行 。在找到内核源码树
,
这个
makefile
会调用
default:


,
这个目标使用先前描述过的方法第二次运行
make
命令
(
注意,在这个
makefile

make
命令被参数化成
$(MAKE))
,以便运行内核构造系统 。在第二
次读取
makefile
时,
它设置了
obj-m,
而内核的
makefile
负责真正构造模块 。
这种构造模块的机制看起来很繁琐,可是,一旦我们习惯了使用这种机制
,
则会
欣赏内核构造系统带给我们的便利 。需要注意的是
,
上面
makefile
并不完整,
一个真正的
makefile
应包含通常用来清除无用文件的目标
,
安装模块的目标等
等 。一个完整的例子可以参考例子代码目录的
makefile

【linux编译静态块命令 linux静态库的生成与使用】关于linux编译静态块命令和linux静态库的生成与使用的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读