zoukankan      html  css  js  c++  java
  • linux下的gcc编译器

    1. 编译单个文件成可执行文件

    gcc hello.c 生成默认的可执行文件a.out

    2. 编译单个文件为指定名字的可执行文件,使用-o选项指定文件名字

    gcc -o test main.c 生成文件名为test的可执行文件

    3. 编译单个源文件成目标文件

    (1)使用-c选项生成目标文件

    gcc -c main.c 生成文件名为main.o的目标文件

    (2)使用-o选项指定目标文件名字

    gcc -c -o test.o main.c 生成文件名为test.o的目标文件

    4. 同时编译多个源文件成目标文件

    使用-c选项生成目标文件

    gcc -c main.c print.c 同时生成 文件名为main.o和print.o的目标文件

    5. 将多个源文件编译成一个可执行文件

    (1)使用-o选项指定可执行文件名,直接编译源文件

    gcc -o test main.c print.c 生成文件名为test的可执行文件

    (2)先生成目标文件,再链接成可以执行文件

    gcc -c main.c print.c 生成多个目标文件
    gcc -o test main.o print.o 链接多个目标文件,生成文件名为test的可执行文件

    6. 预编译命令和生成汇编命令

    (1)使用-E选项进行预编译

    gcc -E print.c 进行预编译操作,结果显示在屏幕上
    gcc -o print.i -E print.c 进行预编译操作,并生成文件名为string.i的预编译结果文件

     (2)使用-S选项进行生成汇编

    gcc -S print.c 生成文件名一致(print.s)的的汇编语言文件
    gcc -o print.s -S print.c 生成文件名为print.s的汇编语言文件

    7. 创建静态库

    (1)静态库是目标文件的集合,使用ar和-r选项将目标文件打包成库,库文件通常以“.a”为后缀

    ar -rcs libprint.a print.o 生成文件名为libprint.a的静态库
    ar -rcs libleo.a print.o string.o 生成文件名为libleo.a的静态库,其中包含print和string的函数库

    注意:必须使用目标文件进行归档,如果直接使用源文件进行归档,在后续的编译器链接时会失败

    (2)链接静态库

    gcc -o test main.c libprint.a 生成文件名为test的可执行文件

    (3)使用-l选项和-L选项链接静态库

    gcc -o test main.c -lprint 使用-l选项后,就不需要指定lib前缀和扩展名,并会在系统默认目录下查找print函数库,该链接可能失败,因为默认系统库下面没有print函数库,需要使用-L选项指定库的操作路径
    gcc -o test main.c -L./ -lprint 在当前目录下查找函数库,如果需要查找多个目录,可以连续使用-L选项
    gcc -o test main.c -L./ -L./lib/ -lprint -lstring 在多个目录下查找库

    8. 创建动态库

    动态库是程序在运行时候加载的库

    (1)使用-shared选项生成动态库,使用-fPIC或者-fpic选项生成位置无关的代码

    gcc -shared -fPIC -o libleo.so print.c string.c 生成文件名为libleo.so的动态库

    (2)链接动态库

    gcc -o test main.c -L./ -lleo 生成文件名为test的可执行文件

    (3)运行可执行文件

    通常程序在执行的时候需要加载动态库,动态库必须在程序的搜索目录下,否则会出现运行时错误。

    添加搜索目录的两种办法:

      - 添加环境变量:export LD_LIBRARY_PATH=/home/leo/test $LD_LIBRARY_PATH;

      - 使用ldconfig /home/leo/test命令,如果不带参数,刷新目录列表,只添加系统默认目录;

    (4)动态加载库:

    使用dlopen(),dlerror(),dlsym()和dlclose()等相关函数

    打开动态库:

    原型 void* dlopen(const char* filename, int flag);
    void* phandler = dlopen("./libleo.so", RTLD_LAZY);
    打开动态库,并库的指针

    获取函数指针:

    原型 void* dlsym(void* handler, char* symbol);
    void* pfunc = dlsym(phandler, "print");
    其中pfunc为函数指针

    打印错误:

    原型 char* dlerror();
    char* perror = dlerror();
    其中perror为错误信息字符串

    关闭动态库

    原型 void dlclose(void* phandler);
    dlclose(phandler);

    编译可执行文件:

    gcc -o test main.c libleo.so -ldl

    gcc 常用的选项:

    -I+dir:扩大头文件的搜索目录;

    -L+dir:扩大链接库的搜索目录;

    -static:使用静态库进行链接;

    -g:包含调试信息;

    -On:优化程序;

    -Wall:打开所有警告信息;

    -Werror:将所有警告信息当成错误消息来处理,并中断编译;

    获取最新的gcc版本:

    apt-get install gcc

  • 相关阅读:
    STM32 USART整理说明(转)
    C++ 如何初始化静态类成员
    scp、sftp和ftps
    PostGIS介绍
    string.h和strings.h的区别
    linux编程中的段错误
    Linux中的man命令
    undefinded reference to 'pthread_create'问题
    多核编程框架
    与ComboBox有相似行为的下拉控件的实现
  • 原文地址:https://www.cnblogs.com/iRidescent-ZONE/p/5944197.html
Copyright © 2011-2022 走看看