精华内容
下载资源
问答
  • 在结构体作为引用传入参数,总是提示编译出错。 LINUX GCC的编译器 代码如下,实现简单双向链表功能 #include <stdio.h> #include <malloc.h> typedef struct LISTNODE { struct ...
  • 另外,makefile里的gcc编译参数是下面这些,换到Linux下后需要修改什么吗? CFLAGS = -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG 关于那个找不到的strcmp.S,用whereis命令查找,结果如下: ...
  • linux下gcc参数的使用以及编译过程

    千次阅读 2015-07-20 21:05:32
    v / --v / --version 查看gcc版本号-I目录 指定头文件目录,注意-I和目录之间没有空格-c 只编译,生成.o文件,不进行链接-g 包含调试信息-On n=1~3 编译优化,n越大优化的越多-Wall 提示更多告警信息(严格编译)-...

    gcc的使用

    -v / --v / --version    查看gcc版本号
    
    -I目录  指定头文件目录,注意-I和目录之间没有空格
    
    -c  只编译,生成.o文件,不进行链接
    
    -g  包含调试信息
    
    -On n=1~3 编译优化,n越大优化的越多
    
    -Wall   提示更多告警信息(严格编译)
    
    -D<DEF> 编译时定义宏,注意-D和<DEF>之间没有空格
    
    -E  生成预处理文件,一般是.i文件,(展开头文件,替换宏常量)
    
    -M  生成.c文件与头文件依赖关系以用于Makefile,包括系统库的头文件
    
    -MM 生成.c文件与头文件依赖关系以用于Makefile,不包括系统库的头文件
    

    gcc各项参数的实际说明

    目录结构:
    .
    ├── include
    │ └── calc.h
    ├── src
    │ └── calc.c
    └── test
    └── main.c

    • 头文件创建格式 calc.h
    #ifndef __CALA_H_
    #define __CALA_H_
    
    int add(int a, int b); 
    int sub(int a, int b); 
    int mul(int a, int b); 
    int div(int a, int b); 
    
    #endif
    • 函数库 calc.c
    int add(int a, int b)
    {
        return a+b;
    }
    int sub(int a, int b)
    {
        return a-b;
    }
    
    • 代码 main.c
    #include <stdio.h>
    //#include "../include/calc.h"  //第一条
    //#include <calc.h>  //第二条
    #include <calc.h> //第三条
    
    
    int main(void)
    {
        int a = 4;
        int b = 2;
        printf("%d + %d = %d\n", a, b, add(a,b));
    
        return 0;
    }

    -I

    • 使用第一条头文件的时候,gcc的编译命令是gcc main.c ../src/calc.c,通过"../include/calc.h"这段找到头文件并且编译成功
    • 使用第二条头文件的时候,gcc的编译命令是gcc main.c ../src/calc.c -I../include/,一般来说,用<>括起来的头文件是系统头文件,-I../include/这条命令就是把../include/这条目录临时并到系统查找的头文件目录里,来查找头文件
    • 使用第三条头文件的时候,gcc的编译命令还是gcc main.c ../src/calc.c -I../include/

    -c

    • gcc命令gcc main.c -I../include/这样的话,会有错误提示
      /tmp/ccQeQFPr.o: In function 'main':
      main.c:(.text+0x29): undefined reference to 'add'
      collect2: ld 返回 1

    因为main函数要调用add函数,但是包含add函数的calc.c没有参与编译,造成add函数未定义

    • 但是如果是执行gcc main.c -I../include/ -c这条命令则不会报错,会生成main.o这个文件,.o叫做可重新定位的目标二进制文件,它是不可执行的,它要跟calc.c生成的calc.o链接才会生成a.c的二进制可执行文件。
      gcc main.c ../src/calc.c -I../include -c/同时生成main.o和calc.o

    -D

    代码

    #include <stdio.h>
    
    int main(void)
    {
        int a;
    
        scanf("%d", &a);
    
    #ifdef MYDEBUG
        printf("a = %d\n", a); //调试语句,查看scanf输入的值是多少
    #endif
    
        if(a > 10) 
            printf("num is more than 10\n");
        else
            printf("num is less than 10\n");
    
        return 0;
    }
    • 在编译器进行预处理的时候,如果发现MYDEBUG(这个名字可以随便起)这个宏没有定义,就会无视从#ifdef到#endif之间的代码
      只有定义了这个宏#define MYDEBUG 1,#ifdef到#endif的代码才会执行,MYDEBUG可以不用置换任何常量,#define MYDEBUG 也是可以的。
    • 也可以通过gcc里面的编译参数来定义这个宏,并且这个宏数全局的gcc -DMYDEBUG main.c,这个时候#ifdef到#endif之间的代码也会执行

    - 应用场景
    在程序研发阶段可以利用-D调试代码,由于调试代码过多,也为了以后进行二次使用这段代码,在不删除调试代码的情况下,生成一个不会出现调试代码的产品,这种方法还是非常便利的。
    当然,也可以把MYDEBUG放到头文件定义,但会有像上例中calc.c的文件本来就不必包含头文件的情况下,多少有些多余,但是方法还是可行的。

    编译过程

    Created with Raphaël 2.1.0gcc编译过程hello.chello.chello.ihello.ihello.shello.shello.ohello.oa.outa.outgcc -Ecpp预处理器gcc -Sgcc编译器gcc -cas汇编器gccld链接器

    hello.c->hello.i->hello.s->hello.o->a.out

    编译工具链

    • cpp :预处理器(展开头文件,替换宏常量)
    • gcc :编译器,是把.c文件翻译成汇编,gcc -S把.c编译成汇编
    • as :汇编器
    • ld :链接器:1.插入启动代码,2.地址重定位

    在.o文件链接之后,还有插入启动代码、地址重定位

    实际上,一个程序是从启动代码开始的,启动代码在调用main函数,例如在main里打开一个文件,如果没有关闭,return 0之后,由启动代码把文件关掉,return的值也是返回给启动代码的。

    展开全文
  • pthread线程操作函数库不是Linux系统默认的库,编译时需要指定使用线程库libpthread.a,所以在使用pthread_create创建线程时,在gcc编译时要加-lpthread参数选项。 root@ubuntu:/home/forlinuxsmb/threads# gcc ...

     pthread线程操作函数库不是Linux系统默认的库,编译时需要指定使用线程库libpthread.a,所以在使用pthread_create创建线程时,在gcc编译时要加-lpthread参数选项。

    root@ubuntu:/home/forlinuxsmb/threads# gcc threadid.c
    /tmp/cc2ZWjnD.o: In function `main':
    threadid.c:(.text+0x3c6): undefined reference to `pthread_create'
    collect2: ld returned 1 exit status
    
    
    如:
    root@ubuntu:/home/forlinuxsmb/threads# gcc threadid.c -lpthread
    root@ubuntu:/home/forlinuxsmb/threads# ./a.out
    
    root@ubuntu:/home/forlinuxsmb/threads# gcc threadid.c -lpthread -o threadid
    root@ubuntu:/home/forlinuxsmb/threads# ./threadid

     

     

     

    展开全文
  • 我感到疑惑的是,我已经在环境变量LD_LIBRARY_PATH中设置了zmq的共享库搜索路径了,在上面的第1个编译命令中,为什么编译的时候仍然提示无法找到-lzmq呢,可以看到头文件和共享库的搜索路径设置是没有问题的。...
  • linux gcc/g++编译安装 gcc7.5.0 c++17

    千次阅读 2019-11-20 16:08:51
    linux C++17编译编译指定参数 -std=c++17 编译指定参数 -std=c++17 例:g++ -std=c++17 main.cpp #如果编译器不支持c++17就会提示:g++: error: unrecognized command line option ‘-std=c++17’ 方法: 1.下载高...

    linux C++17编译:

    编译指定参数 -std=c++17

    例:g++ -std=c++17 main.cpp
    #如果编译器不支持c++17就会提示:g++: error: unrecognized command line option ‘-std=c++17’

    方法:
    1.下载高版本gcc 建议7.3以上
    wget http://mirror.linux-ia64.org/gnu/gcc/releases/gcc-7.5.0/gcc-7.5.0.tar.gz
    2.解压:
    tar -zxvf gcc-7.5.0.tar.gz
    3.进入目录执行脚本下载依赖包:
    cd gcc-7.5.0
    ./contrib/download_prerequisites
    输出结果
    [root@localhost gcc-7.5.0]# ./contrib/download_prerequisites
    2019-11-19 17:19:29 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> “./gmp-6.1.0.tar.bz2” [1]
    2019-11-19 17:19:52 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> “./mpfr-3.1.4.tar.bz2” [1]
    2019-11-19 17:20:11 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> “./mpc-1.0.3.tar.gz” [1]
    2019-11-19 17:21:26 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446] -> “./isl-0.16.1.tar.bz2” [1]
    gmp-6.1.0.tar.bz2: OK
    mpfr-3.1.4.tar.bz2: OK
    mpc-1.0.3.tar.gz: OK
    isl-0.16.1.tar.bz2: OK
    tar (child): lbzip2: Cannot exec: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2
    tar: Error is not recoverable: exiting now
    error: Cannot extract package from gmp-6.1.0.tar.bz2

    这种清空需要下载一个 lbzip2
    yum install lbzip2 再执行就ok了。

    4.编译:
    先创建一个文件夹 把这四个依赖的都cp进去。
    mkdir gcc-Builder-7.5.0
    cp gmp-6.1.0.tar.bz2 mpfr-3.1.4.tar.bz2 mpc-1.0.3.tar.gz isl-0.16.1.tar.bz2 gcc-Builder-7.5.0
    然后进入该文件夹
    cd gcc-Builder-7.5.0
    先进行编译配置,生成makefile文件
    执行
    …/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
    看是否成功,成功之后会在当前目录生成Makefile文件
    开始编译:
    make -j4
    编译时间有点长大概二十到半个小时

    5.安装:
    安装前要卸载原来gcc ,g++
    查看安装的包
    rpm -q gcc
    rpm -q gcc-c++
    再根据包名卸载之

    rpm -e 包名
    此处可能有些依赖不能卸载,于是使用强制卸载才行
    rpm -e 包名 --nodeps
    注意:可能以来的程序使用不正常

    安装:
    进入当前目录下的gcc进行安装
    cd gcc
    make -j8
    完成了检查一下是否成功:
    gcc -v
    g++ -v
    如果不成功请检查下环境变量对不对,
    我的是安装在/usr/local/bin/ 下面
    因我卸载gcc的时候 有些依赖,卸载失败我就直接安装了,结果g++ 正常7.5.0,而gcc还是就的4.8.5
    于是我才强制卸载,之后再make -j8.后来遇到 libstd++ 里面缺少好多东西的
    解决办法
    把这条软连接
    /usr/lib/libstdc++.so.6 -> /usr/local/lib/libstdc++.so.6.0.19
    改为:
    /usr/lib/libstdc++.so.6 -> /usr/local/lib64/libstdc++.so.6.0.24
    ok!
    可能是因为我安装的时候有依赖没法自动修改这个连接导致的,不知道一个空的机器有没有这个问题。

    展开全文
  • Linux下C代码的编译

    千次阅读 2018-10-13 23:06:04
    我们要做这样一件事:在Linux系统下实现一个加减法的命令行小工具,这个小工具可以接收一个参数,当参数为a时根据提示输入数字进行加法运算,当参数为b时进行减法运算。操作过程如图所示,程序比较简单主要想说明...

    任务

    我们要做这样一件事:在Linux系统下实现一个加减法的命令行小工具,这个小工具可以接收一个参数,当参数为a时根据提示输入数字进行加法运算,当参数为b时进行减法运算。操作过程如图所示,程序比较简单主要想说明以下两个事情:

    1. Linux系统下多个源文件c项目的源码编译过程;
    2. make命令的执行及Makefile文件的编写

    在这里插入图片描述

    准备C的代码

    首先写两个函数,为了实验多源文件的而将他们写在两个 .c文件中
    其中add.c

    // add.c
    #include<stdio.h>
    #include "add.h"
    int add(int _a , int _b){
      return _a + _b;
    }
    

    添加一个头add.h

    // add.h
    int add(int _a , int _b);
    

    减法函数源文件decrease.c

    // decrease.c
    #include<stdio.h>
    #include"decrease.h"
    int decrease(int _a , int _b){
      return _a - _b;
    }
    

    它的头文件decrease.h

    // decrease.h
    int decrease(int _a , int _b);
    

    准备好这四个文件以后写mian函数的文件,命名为comp

    // comp.c
    #include<stdio.h>
    #include "add.h"
    #include "decrease.h"
    int main(int argv,char* argc[])
    {
      char ad = argc[1][0];
      if('a' == ad){
        printf("Compute Command is + : \n");
      } else if('d' == ad) {
        printf("Compute Command is - : \n");
      }
      int a,b;
      printf("Input A : ");
      scanf("%d",&a);
      printf("Input B : ");
      scanf("%d",&b);
      if('a' == ad){
        printf("A + B = %d \n",add(a,b));
      } else if('d' == ad) {
        printf("A - B = %d \n",decrease(a,b));
      }
      return 0;
    }
    

    编译

    执行如下命令进行编译,其中

    [root@VM_0_13_centos linuxc]# gcc add.c decrease.c comp.c -o comp.out
    

    当源文件太多时候,可以使用make来组织源文件的编译工作,做法是在同级目录下新建一个 Makefile 文件。

    # Makefile
    comp:add.o decrease.o comp.c
            gcc add.o decrease.o comp.c -o comp
    add.o:add.c
            gcc -c add.c
    decrease.o:decrease.c
            gcc -c decrease.c
    

    执行命令

    [root@VM_0_13_centos linuxc]# make
    

    查看当前目录,新生成了两个 .o文件和一个可执行文件 comp ,下来可以测试一下 [命令]+[参数] 的形式啦。
    在这里插入图片描述
    .
    .
    .
    .
    .
    桃花仙人种桃树,又摘桃花换酒钱

    展开全文
  • 64位Linux系统编译32位汇编程序

    千次阅读 2015-07-18 17:17:35
    64位Linux系统编译32位汇编程序的时候需要仿真32位系统的需求,发现使用-m32参数后,编译提示错误,如下: /usr/bin/ld: 未知的仿真模式: 32 支持的仿真: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om ...
  • 当在用Eclipse编译使用数学函数的C语言程序时,如sqrt,pow,即使已经加入math.h,也会提示类似于undefined reference to `sqrt’这样的错误。搜索得知需要给gcc加上-lm参数.添加参数方法: 右键点击当前 p...
  • 缺少某个库,用 -l参数将库加入。Linux的库命名是一致的,一般为libxxx.so,或libxxx.a,libxxx.la,那么你要链接某个库就用-lxxx,去掉头lib及"."后面的so,la,a等即可。 同时,常见的库链接方法为: 数学库 -lm ,...
  • Linux编译程序时如果缺少连接库会提示如下错误: $ gcc test.c -o test -lxxx /usr/bin/ld: cannot find -lxxx collect2: error: ld returned 1 exit status 先介绍下GCC命令的 -L 和 -l 参数。 -l参数就是...
  • Linux编译MySQLdb遇到的问题

    千次阅读 2007-10-21 02:15:00
    今天在Linux下安装MySQLdb,遇到了这样的问题:执行setup.py install的时候,提示找不到mysqlclient_r动态库。看了一下输出的gcc编译命令,已经通过-L参数制定了mysql动态库的路径,按理说不应该是路径的问题。为了...
  • gcc编译优化参数

    千次阅读 2012-08-11 17:46:07
    GCC编译器选项及优化提示 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的...
  • Linux基础——gcc编译、静态库与动态库(共享库)

    万次阅读 多人点赞 2018-07-03 17:44:34
    gcc编译器 1、gcc工作流程 2、gcc常用参数 参数 用途 -v 查看版本 -o 产生目标文件 -I+目录 ... 编译时定义宏 ... 提示更多警告信息 -c 只编译子程序 -E 生成预处理文件 ...
  • 1.配置cmake参数提示: The C compiler identification is unknown. The CXX compiler identification is unknown. 根据上面的提示可知这是系统没有安装c编译器导致的。 安装c编译器: yum install gcc gcc-...
  • 今天再Linux环境下遇到个诡异的现象,在链接动态库时总是...检查库是否已经安装,并在编译命令中采用-l和-L参数导入库。 2、如果提示未定义的函数是程序中的函数。检查是否在头文件中声明,是否在编译中有对应的obj文件
  • gcc 编译器 1、gcc 工作流程 2、gcc常用参数 参数 用途 ...编译时定义宏 ...提示更多警告信息 -c 只编译子程序 -E 生成预处理文件 -g 包含调试信息 静态库 1、静态库的命名格式 lib + 库...
  • #linux# gcc常用命令行参数说明

    万次阅读 2020-06-19 11:33:10
    Table of Contents 基本选项 警告提示选项 库操作选项 ...因为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不
  • ZC: 都是网上搜到的1、问题:在linux下编写多线程,已经添加#include头文件,qt编译器提示: error: undefined reference to `pthread_create'。经过百度,得知:“pthread 库不是 Linux 系统默认的库,连接时需要...
  • 检查库是否已经安装,并在编译命令中采用-l和-L参数导入库。 如果提示未定义的函数是程序中的函数。检查是否在头文件中声明,是否在编译中有对应的obj文件,检查函数的或者变量的名字是否正确,是否是因为前后...
  • Qt5编译添加gcc参数

    2019-09-24 12:48:12
    ZC: 都是网上搜到的 ...头文件,qt编译器提示: error: undefined reference to `pthread_create'。经过百度,得知:“pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthre...
  • 近期用NDK编译Openssl,期间发现不能编译成功,提示如下错误 make: execvp: /home/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++: ...
  • 提示说没有找到mysql/mysql.h时(当你的mysql是源文件安装的时候,可能会这样;当然,如果是rpm安装的,但是没有安装mysql-dev包,也会如此),可以 cp -r /usr/local/mysql/include/...编译时加上参数 -lmysqlclient
  • -n参数:查看文本内容时显示行号 执行cat -n 文件命令: more命令 more命令用于查看纯文本文件(内容较多),格式为“more[选项][文件]”。 对于长篇文本内容,可以使用more命令。more命令会在最下面使用...
  • Flex编译参数(2)

    2010-04-26 17:02:44
    以前想着用Adobe Flex Builder for Linux软件来进行Flash开发,但用后你会发现这个基于eclipse ...除去代码提示它在Linux下与其他支持语法高亮的软件差不多。但有一点由于他在 是基于Java写的ecli...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 228
精华内容 91
关键字:

linux参数提示编译

linux 订阅