• gcc 的基本使用和静态库、动态库的制作与使用


    PS:我学习测试的时候写的是CPP代码,所以下面记录的时候用的是g++,当然也可以用gcc,但是要加参数,嫌麻烦就用的g++。只写C代码的话将g++改为gcc即可。

    1、-c 只编译,生产.o文件,不进行链接;-o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out。

    g++ -c main.cpp -o main.o

    2、-Wall 提示更多警告信息;-On n = 0~3 ,编译优化,n越大优化的越多。

    g++ main.cpp -Wall -O0 -o app
    g++ main.cpp -Wall -O1 -o app1
    g++ main.cpp -Wall -O3 -o app2

    3、-D 编译时定义宏(下面代码运行会输出Hello World!);-g 包含调试信息(GDB调试器需要,编译出来的程序比不加-g时编译出来的程序要大)

    g++ main.cpp -D DEBUG -g -o app
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a = 112;
        #ifdef DEBUG
        cout << "Hello World!" << endl;
        #endif
        cin.get();
        return 0;
    }

    4、-I 指定头文件目录(include是当前目录下的文件夹,head.h在这个目录下)

    g++ main.cpp -I include -o app
    #include <iostream>
    #include "head.h"
    using namespace std;
    
    int main()
    {
        int a = 112;
        cout << "NUM1 + NUM2 = " << NUM1 + NUM2 << endl;
        #ifdef DEBUG
        cout << "Hello World!" << endl;
        #endif
        cin.get();
        return 0;
    }

     5、静态库的制作与使用

    head .h 放在 include 文件夹

    #ifndef HEAD_H
    #define HEAD_H
    
    #include <stdio.h>
    
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    
    #endif

    add.c,sub.c,mul.c放在  src 文件夹下,

    int add(int a, int b)
    {
        return a + b;
    }
    int sub(int a, int b)
    {
        return a - b;
    }
    int mul(int a, int b)
    {
        return a * b;
    }

    生成 .o 文件

    gcc *.c -c -I ../include

    生成静态库

    ar rcs libMyCalc.a *.o

    将静态库 libMyCalc.a 移动到上级 lib 文件夹

    mv libMyCalc.a ../lib/

    静态库的使用:编译 main.c  与(include、lib、src文件夹在同一目录)

    第一种编译方法:

    gcc main.c ./lib/libMyCalc.a -I include -o app

    第二章编译方法:

    gcc main.c -Iinclude -L lib -l MyCalc -o app

     6、动态库的制作与使用

    使用的文件与上面制作静态库使用的文件及目录是一样的。

    生成 .o 文件(生成与位置无关的代码)

    gcc -fPIC -c *.c -I ../include

    生成动态库

    gcc -shared -o libMyCalc.so *.o -I ../include

    将动态库 libMyCalc.so 移动到上级 lib 文件夹

    mv libMyCalc.so ../lib/

    动态库的使用:编译 main.c  与(include、lib、src文件夹在同一目录)

    第一种编译方法:

    gcc main.c lib/libMyCalc.so -o app -I include

    第二种编译方法:

    gcc main.c -L ./lib -l MyCalc -o MyApp -I include

    下面的命令可以查看我们的程序需要链接的动态库

    ldd MyApp

    解决动态库链接失败的问题:

    第一种方法:放到系统的库目录 ./lib 中(但是这种方法不允许使用,你懂得)。

    第二种方法:将动态库的路径设置给环境变量  LD_LIBRARY_PATH,然后将设置的值,导入到系统环境变量中。(这种方法 临时测试 的时候可以使用,终端关闭就会失效)

    export LD_LIBRARY_PATH=./lib

    第三种方法(不常用的方法,永久设置):在家目录的.bashrc文件中添加下面的一句话

    export LD_LIBRARY_PATH=./lib

    第四种方法(常用):找到动态链接器的配置文件 /etc/ld.so.conf 将动态库的绝对路径写到配置文件(需要管理员权限)。然后需要使用下面的命令更新即可。

    sudo ldconfig -v
  • 相关阅读:
    棋盘格渲染
    openvino踩坑之Data type is unsupported
    [video super resolution] ESPCN论文笔记
    tensorflow fp16训练
    openvino安装踩坑记
    python numpy中astype使用不当导致图像出现artifact
    Python~字典
    Django~待解决的问题
    正则表达式应用
    GitLab使用
  • 原文地址:https://www.cnblogs.com/duxie/p/12814553.html
Copyright © 2020-2023  润新知