• 热门搜索:
  • 装机系统
  • 雨林木风系统
  • 深度系统
  • 电脑公司系统
  • win7装机版
  • 教程分类
    当前位置:主页 > 教程咨询 > Linux教程

    Linux编译相关命令

    来源:装机员┆发布时间:2018-11-21 06:00┆点击:

    装机员为您提供Linux编译相关命令的文章咨询供您阅读,如何使用Linux编译相关命令的方法对您有帮助也请您举手之劳分享给您身边的人。

    一、编译可执行文件

    g++ –c Hello.cpp  编译文件,生成目标文件Hello.o

    g++ Hello.o –o a.out  链接并重命名为可执行文件a.out

    g++ Hello.cc    编译链接一起,生成a.out

    g++ Hello.cc –o hello 生成a.out并命名为hello

    二、编译相关选项

    (1)-c

    生成.o文件,对代码文件进行预处理、编译和汇编,相当于windowsdows下生成目标文件obj

    g++ -c hello.cpp

    (2)-I DirPath

    指定文件查找路径

    -include file

    -i file

    指定包含的文件

    g++ hello.cpp -include ../include/a.h

    -I- DirPath

    就是取消前一个参数的功能,所以一般在-I DirPath之后使用

    (3)-L LibPath

    指定链接库的目录

    -l library

    -llibrary

    指定链接库

    (4)  -g   
    在编译的时候,产生调试信息,程序运行时可以dbg调试

    (4)-static

    此选项将禁止使用动态库。

    优点:程序运行不依赖于其他库

    缺点:文件比较大

    gcc test_main.c -static -o test_main -lpthread

    会发现test_main很大,它已经把各种依赖的东西都包含进来

    (5) -shared (-G)

    此选项将尽量使用动态库,为默认选项

    优点:生成文件比较小

    缺点:运行时需要系统提供动态库

    (6)-Wall

    一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。

    三、静态库和动态库的编译命令

    1、生成动态库和静态库

    (1)得到hello.o

    g++ -c hello.cpp

    (2)得到静态库myhello.a

    ar -cr libmyhello.a hello.o

    (3)使用静态库

    g++ -o hello main.c -L. -lmyhello

    -L.表示静态库位于当前路径下,myhello自动加上lib组成静态库名称libmyhello.a

    (4)得到动态库myhello.so

    g++ -fPIC -shared hello.cpp -o libmyhello.so

    (5)使用动态库

    动态库的时候和静态库使用一样,唯一值得注意的是当路径中同时存在相同名称的动态库和静态库时,编译的时候优先使用动态库

    2、fPIC选项

    加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。

    不加fPIC,则加载so文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置。可见,这种方式更消耗内存。

    3、如何解决运行时找不到动态库的问题

    (1)将动态库添加到系统默认的搜索目录下,如/lib、/usr/lib

    (2)设置临时动态库目录的环境变量,这种方法设置的是临时的,系统重启之后就没了

    export LD_LIBRARY_PATH=./

    取消设置

    export LD_LIBRARY_PATH=

    (3)/etc/ld.so.cache中缓存了动态库目录,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索目录,然后执行ldconfig命令来改变

    (4)编译链接添加-WL,-rpath命令选项,将运行时动态库的搜索目录记录在可执行程序中

    例如,有源文件test.cpp和func.cpp

    g++ -shared -fPIC func.cpp -o libfunc.so

    编译得到libfunc.so动态库

    g++ main.cpp -o a.out -L ./ -lfunc

    编译得到a.out,win7装机版,执行a.out,提示出错

    Linux编译相关命令

    ldd查看a.out依赖的动态库,发现libfunc.so找不到

    g++ main.cpp -o a.out -L ./ -lfunc -WL,-rpath ./

    编译得到a.out,执行a.out,运行成功,ldd查看a.out依赖的动态库,发现libfunc.so目录正确

    Linux编译相关命令

    把a.out和libfunc.so拷贝到任何路径下,都能运行成功

    Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx


    以上就是装机员给大家介绍的如何使用Linux编译相关命令的方法了,如何使用Linux编译相关命令的方法到这里也全部结束了相信大家对如何使用Linux编译相关命令的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击装机员系统官网吧。

    本文来自装机员www.zhuangjiyuan.com如需转载请注明!

    Tag标签| RSS订阅 | 网站地图
    装机员系统之家提供win7装机版xp系统下载win7系统下载、最新Windows10系统下载,专为装机修机员奉上最好的软件、系统、U盘pe、程等平台
    请勿发布违反国家法律法规的内容,会员观点不代表本站立场.本站发布的系统与软件仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,
    否则后果自负,请支持购买微软正版软件! 如侵犯到您的权益,请及时通知我们,我们会及时处理。 粤ICP备15116662号