zoukankan      html  css  js  c++  java
  • C程序编译链接问题

    今天写C程序遇到了一个问题,错误提示如下:

    /tmp/ccDjB9kK.o: In function `is_prime':
    prime_estimate.c:(.text+0x1f): undefined reference to `sqrt'
    collect2: ld returned 1 exit status

    上述错误是在使用gcc的时候产生的,编译命令为:

    gcc my_prime_est.h prime_estimate.c prime_est_main.c

    把上面的命令替换为用g++编译

    gcc my_prime_est.h prime_estimate.c prime_est_main.c

    没有错误,生成了正常的可执行程序。

    开始,我怀疑是不是头文件包含没写好,检查过后,发现头文件包含正常,而且g++编译可以通过

    于是去百度gcc编译器的一些信息,在一篇博客中找到了问题所在,博客地址如下

    http://anony3721.blog.163.com/blog/static/51197420093762818167/

    下面总结一下,从c程序的源代码到可执行程序的生成,需要两个大的步骤:

      一、编译,以文件为单位,把源文件编译为目标文件,以.o结尾,在编译之前,会先完成包含头文件等预处理,即处理所有以#号开始的行

      二、链接,有的程序包含多个源文件,从而会有多个目标文件,这些目标文件需要链接起来才能组成可执行程序

    其实上面遇到的错误,是链接错误,gcc在链接期间,如果用到某些函数库里的函数,需要显示指出函数库,具体方法是在命令中加入-l函数库名,例如数学函数库的完整名称为libm.so,那么指出需要用到的函数库的命令为 -lm,即去掉lib和.so之后的部分,注意这里的 l 是小写的L,而不是I。

    g++要更智能一些,在链接期间会自动寻找需要的函数库,于是就出现了上面的现象:gcc不行,g++可以

    下面列出一些gcc和g++编译和链接的时候常用的命令行选型:

    选项 解释
    -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
    例如 asm 或 typeof 关键词。
    -c 只编译并生成目标文件。
    -DMACRO 以字符串“1”定义 MACRO 宏。
    -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
    -E 只运行 C 预编译器。
    -g 生成调试信息。GNU 调试器可利用该信息。
    -IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
    -LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
    -lLIBRARY 连接时搜索指定的函数库LIBRARY。
    -m486 针对 486 进行代码优化。
    -o FILE 生成指定的输出文件。用在生成可执行文件时。
    -O0 不进行优化处理。
    -O 或 -O1 优化生成代码。
    -O2 进一步优化。
    -O3 比 -O2 更进一步优化,包括 inline 函数。
    -shared 生成共享目标文件。通常用在建立共享库时。
    -static 禁止使用共享连接。
    -UMACRO 取消对 MACRO 宏的定义。
    -w 不生成任何警告信息。
    -Wall 生成所有警告信息。

  • 相关阅读:
    iptables防火墙--------基本操作
    iptables防火墙--------基本概念
    常用运维工具小结
    ELK6.6.0+filebeat6.6.0部署
    Yum安装时出现 The program yum-complete-transaction is found in the yum-utils package
    重温面向对象核心 下 : 你一定能看懂的委托和事件
    重温面向对象核心 上
    程序员创业第一步:如何获取第一笔风险投资
    MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件
    MVC+EFCore 完整教程18 -- 升级分布视图至 View Component
  • 原文地址:https://www.cnblogs.com/un4sure/p/2442547.html
Copyright © 2011-2022 走看看