A. linux杞浠跺紑鍙戞椂缁檊cc鎸囧畾澶存枃浠跺拰搴撴枃浠惰矾寰勭殑鏂规硶
鍦↙inux 涓嫔紑鍙戣蒋浠舵椂锛屽畬鍏ㄤ笉浣跨敤绗涓夋柟鍑芥暟搴撶殑𨱍呭喌鏄姣旇缉灏戣佺殑锛岄氩父𨱒ヨ查兘闇瑕佸熷姪涓涓鎴栧氢釜鍑芥暟搴撶殑鏀鎸佹墠鑳藉熷畬鎴愮浉搴旂殑锷熻兘銆备粠绋嫔簭锻樼殑瑙掑害鐪嬶纴鍑芥暟搴揿疄 闄呬笂灏辨槸涓浜涘ご鏂囦欢锛.h锛夊拰搴撴枃浠讹纸.so鎴栬.a锛夌殑闆嗗悎銆傝槠铹禠inux涓嬬殑澶у氭暟鍑芥暟閮介粯璁ゅ皢澶存枃浠舵斁鍒/usr/include/鐩褰曚笅锛岃屽簱 鏂囦欢鍒欐斁鍒/usr/lib/鐩褰曚笅锛屼絾骞朵笉鏄镓链夌殑𨱍呭喌閮芥槸杩欐牱銆傛e洜濡傛わ纴GCC鍦ㄧ紪璇戞椂蹇呴’链夎嚜宸辩殑锷炴硶𨱒ユ煡镓炬墍闇瑕佺殑澶存枃浠跺拰搴撴枃浠躲
GCC閲囩敤鎼灭储鐩褰旷殑锷炴硶𨱒ユ煡镓炬墍闇瑕佺殑鏂囦欢锛-I 阃夐”鍙浠ュ悜GCC镄勫ご鏂囦欢鎼灭储璺寰勪腑娣诲姞鏂扮殑鐩褰曘备緥濡傦纴濡傛灉鍦/home/xiaowp/include/鐩褰曚笅链夌紪璇戞椂镓闇瑕佺殑澶存枃浠讹纴涓轰简璁〨CC鑳藉熼‘鍒╁湴镓惧埌瀹冧滑锛屽氨鍙浠ヤ娇鐢-I阃夐”
钖屾牱锛屽傛灉浣跨敤浜嗕笉鍦ㄦ爣鍑嗕綅缃镄勫簱鏂囦欢锛岄偅涔埚彲浠ラ氲繃-L阃夐”钖慓CC镄勫簱鏂囦欢鎼灭储璺寰勪腑娣诲姞鏂扮殑鐩褰曘备緥濡傦纴濡傛灉鍦/home/xiaowp/lib/鐩褰曚笅链夐摼鎺ユ椂镓闇瑕佺殑搴撴枃浠秎ibfoo.so锛屼负浜呜〨CC鑳藉熼‘鍒╁湴镓惧埌瀹冿纴鍙浠ヤ娇鐢ㄤ笅闱㈢殑锻戒护锛
鍊煎缑濂藉ソ瑙i喷涓涓嬬殑鏄-l阃夐”锛屽畠鎸囩ずGCC铡昏繛鎺ュ簱鏂囦欢libfoo.so銆侺inux涓 镄勫簱鏂囦欢鍦ㄥ懡钖嶆椂链変竴涓绾﹀畾锛岄偅灏辨槸搴旇ヤ互lib涓変釜瀛楁瘝寮澶达纴鐢变簬镓链夌殑搴撴枃浠堕兘阆靛惊浜嗗悓镙风殑瑙勮寖锛屽洜姝ゅ湪鐢-l阃夐”鎸囧畾阈炬帴镄勫簱鏂囦欢钖嶆椂鍙浠ョ渷铡 lib涓変釜瀛楁瘝锛屼篃灏辨槸璇碐CC鍦ㄥ-lfoo杩涜屽勭悊镞讹纴浼氲嚜锷ㄥ幓阈炬帴钖崭负libfoo.so镄勬枃浠躲
Linux涓嬬殑搴撴枃浠跺垎涓轰袱澶х被鍒嗗埆鏄锷ㄦ侀摼鎺ュ簱锛堥氩父浠.so缁揿熬锛夊拰闱欐侀摼 鎺ュ簱锛堥氩父浠.a缁揿熬锛夛纴涓よ呯殑宸鍒浠呭湪绋嫔簭镓ц屾椂镓闇镄勪唬镰佹槸鍦ㄨ繍琛屾椂锷ㄦ佸姞杞界殑锛岃缮鏄鍦ㄧ紪璇戞椂闱欐佸姞杞界殑銆傞粯璁ゆ儏鍐典笅锛孏CC鍦ㄩ摼鎺ユ椂浼桦厛浣跨敤锷ㄦ侀摼 鎺ュ簱锛屽彧链夊綋锷ㄦ侀摼鎺ュ簱涓嶅瓨鍦ㄦ椂镓嶈冭槛浣跨敤闱欐侀摼鎺ュ簱锛屽傛灉闇瑕佺殑璇濆彲浠ュ湪缂栬疟镞跺姞涓-static阃夐”锛屽己鍒朵娇鐢ㄩ润镐侀摼鎺ュ簱銆备緥濡傦纴濡傛灉鍦 /home/xiaowp/lib/鐩褰曚笅链夐摼鎺ユ椂镓闇瑕佺殑搴撴枃浠秎ibfoo.so鍜宭ibfoo.a锛屼负浜呜 GCC鍦ㄩ摼鎺ユ椂鍙鐢ㄥ埌闱欐侀摼鎺ュ簱锛屽彲浠ヤ娇鐢ㄤ笅闱㈢殑锻戒护锛
澶嶅埗浠g爜
浠g爜濡备笅:
# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo
B. linux 编译怎么连接动态库
Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用-L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用-l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
C. 关于linux下连接动态库问题
gcc编译时,当使用动态库编译可以按照几种写法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的编译参数都是按照2或3去写
2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库就会去找静态库,再没有应该就会在编译时报错
3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库
1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf -a a.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的操作
你第二次操作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd操作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。
你可以试试将a.out拷贝至其他目录再次运行,将出现和第一次操作时一样的现象,找不到function.so文件。
具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名称为libSDL2-2.so
D. linux怎样实现c语言动态库与静态库的链接
Linux系统中静态库是.a文件,编译链接.a文件只需要加上.a文件的完整的文件路径就可以了,比如:
gcc -o hello hello.c /usr/lib/libm.a
Linux系统的动态库是系统中的.so文件,编译链接动态库需要用-L参数指定动态库的搜索路径,还要用-l(这个是小写的L)指定动态库的名字,比如:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
E. 请问我有一个.so文件,如何在Linux下编程使用呢
-lxx
xx是你的.so文件名
其实使用方法和你使用数学库函数是一样的,源代码中添加
#include <math.h>,编译的时候,加上-lm参数。
注:linux下的.so文件为共享库,相当于windows下的dll文件。
linux下编写调用so文件实例
.so是Linux(Unix)下的动态链接库. 和.dll类似.
比如:
文件有: a.c, b.c, c.c
gcc -c a.c
gcc -c b.c
gcc -c c.c
gcc -shared libXXX.so a.o b.o c.o
要使用的话也很简单. 比如编译d.c, 使用到libXXX.so中的函数, libXXX.so地址是MYPATH
gcc d.c -o d -LMYPATH -lXXX
注意不是-llibXXX
test.c文件和一个test.h,这两个文件要生成libsotest.so文件。然后我还有一个testso.c文件,在这个文件里面调用libsotest.so中的函数。
编写的过程中,首先是编译so文件,我没有编写makefile文件,而是参考的2里面说的直接写的gcc命令。
因为so文件里面没有main函数,所以是不可执行的,所以编译的时候要加上-c,只生成目标文件。
F. (linux)动态链接库找不到路径
ld.so.conf只是在编译时查找动态库的路径;
运行时动态库的查找路径默认在/usr/lib和/lib,所以找不到
可以设置LD_LIBRARY_PATH=/usr/local/ma(你动态库的所在目录)
或者把动态库拷贝到/usr/lib或/lib下
G. 如何指定gcc的默认头文件路径
gcc指定头文件路径及动态链接库路径
本文详细介绍了Linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。本文包含了很多的例子,具有很强的操作性,希望读者自己去走一遍。
一.#include <>与#include “”
#include <>直接到系统指定的某些目录中去找某些头文件。
#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件。
二.gcc指定头文件的三种情况:
1.会在默认情况下指定到/usr/include文件夹(更深层次的是一个相对路径,gcc可执行程序的路径是/usr/bin/gcc,那么它在实际工作时指定头文件头径是一种相对路径方法,换算成绝对路径就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)
2.GCC还使用了-I指定路径的方式,即
gcc -I 头文件所在文件夹(绝对路径或相对路径均可) 源文件
举一个例子:
设当前路径为/root/test,其结构如下:
include_test.c
include/include_test.h
有两种方法访问到include_test.h。
1. include_test.c中#include “include/include_test.h”然后gcc include_test.c即可
2. include_test.c中#include 或者#include 然后gcc –I include include_test.c也可
3. 参数:-nostdinc使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置。
在编译驱动模块时,由于非凡的需求必须强制GCC不搜索系统默认路径,也就是不搜索/usr/include要用参数-nostdinc,还要自己用-I参数来指定内核头文件路径,这个时候必须在Makefile中指定。
头文件搜索顺序:
1.由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)
2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3.再找内定目录
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
库文件,但是如果装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
三.Linux指定动态库路径
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。
1.在配置文件/etc/ld.so.conf中指定动态库搜索路径。
可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。
举一个例子:
所有源文件:
源文件1: lib_test.c
#include
void prt()
{
printf(“You found me!!!/n”);
}
源文件2: main.c
void prt();
int main()
{
prt();
return 0;
}
H. GCC中静态连接和动态连接的区别
gcc中静态连接和动态链接的方法:
1:GCC的静态连接,直接把静态库的名字放在gcc后面
例如:gcc-otesttest.cstaticlib.a
2:GCC的动态连接,使用-l指定库,-L指定库的路径,注意动态库名必须是lib开头,后缀名为.so
例如:gcc-otesttest.c-lpthread-L/usr/lib/
3:静态库也可以采用动态库的连接方法,如果目录中同时存在2种库,gcc会优先选择动态库。如果一条gcc链接指令中既要链接动态库又要链接静态库,可以用-Wl,-dn和-Wl,-dy参数选项来切换。
静态连接和动态链接的主要区别:
1:静态连接的时候,静态库的所有执行代码被直接编译到目标程序中。而动态连接的时候,仅仅把动态库的函数和变量的符号名,地址偏移量等导入到目标程序。只有在目标程序运行的时候才把动态库的执行代码加载到内存中。
2:动态链接的项目容易管理,把不同模块封装成不同的动态库,如果模块功能修改,一般只需要重新生成该动态库,不用重新编译其他模块和目标程序。而静态链接的程序修改任何一个地方都必须重新编译整个程序
3:静态链接生成的目标程序体积比动态链接的大,但是加载速度更快,发布更容易,不需要检查发布机器上是否有该动态库或者动态库版本是否符合要求。
4:如果多个程序使用一个动态库,则该库的执行代码只会在内存中加载一次。而静态库是多次加载(事实上静态库连接完就没用了,等于目标程序的一部分)。
5:从调试的角度来说,静态连接的程序调试方法和独立程序没有任何区别,而动态库的调试相对要复杂一些,因为库里面的符号地址都是相对地址。