zoukankan      html  css  js  c++  java
  • 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文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件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,执行a.out,提示出错

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

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

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

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

  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/justkong/p/9149624.html
Copyright © 2011-2022 走看看