首页 > 编程语言 >【c&c++】gcc -l参数和-L参数

【c&c++】gcc -l参数和-L参数

时间:2022-11-17 14:35:22浏览次数:50  
标签:gcc lib -- c++ so usr 参数 链接

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了

 

好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)

 

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest

 

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,

 

如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

 

手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如

 

gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

 

-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果

 

现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。

 

5、-include和-I参数

 

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。

 

标签:gcc,lib,--,c++,so,usr,参数,链接
From: https://www.cnblogs.com/opensmarty/p/16899357.html

相关文章

  • fluentd的配置文件中指令,参数,插件,插件参数的区别是什么?
    source:指令 @type:参数。指定插件的名字。 forward/http:插件的名字。 port:插件的参数。 ......
  • 【c&c++】include的作用
    #include发生在预处理阶段,整个编译链接过程,#include是最简单的了,没有之一。就是在include的位置直接把文件原原本本完完整整一字不落的包含进来,下面举一个极端点的例子://......
  • gcc 9.3编译
    CentOS7升级GCC版本至9.31前言2开始2.1下载GCC69.3.0源码并解压2.2安装gcc所需依赖项2.3编译gcc源码2.4编译生成makefile文件,并安装2.5设置环境变量2.6设置头文件......
  • 【c&c++】LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
    LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定......
  • 【c&c++】为什么库要分为静态库和动态库
    根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。而动态库是在程序执行......
  • 【c&c++】链接静态库文件时的搜索路径
    经测试,链接静态库的时候静态库的搜索路径包括/lib;/lib64;/usr/lib;/usr/lib64/;/usr/local/lib;/usr/local/lib64, 静态库文件完整的搜索顺序:比如我们要生成的最终可......
  • 【c&c++】如何创建动态库
    静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。而依赖动态库的程序其实也有链接动态库的阶段,只不过这个链接并不是真......
  • 【c&c++】 -fpic 与-fPIC的区别
        在编译动态库的时候,我们应该需要使用-fpic或-fPIC参数。pic与PIC的异同相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址......
  • 【C++高级编程】(二)设计专业的C++程序
    本章内容:程序设计的定义程序设计的重要性C++程序设计的特点高效C++程序设计的两个基本主题:抽象以及重用不同类型的重用代码代码重用的优缺点重用代码的常用策略及......
  • c++多线程thread用法小例子
    测试分布式存储系统时,针对并发测试,同时创建500个文件,采用这种方法。#include<iostream>#include<thread>usingnamespacestd;voidproc(inta){cout<<"子线......