linux下c语言gcc编译的时候如果不知道.c文件怎么链接的?

author author     2023-05-11     318

关键词:

比如说#include<string.h>,我们不知道它的实现文件在哪,而系统自动找到它的实现文件并能链接。

有以下步骤:

  1.源程序的编译
    在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面
  我们以一个实例来说明如何使用gcc编译器.
  假设我们有下面一个非常简单的源程序(hello.c):
  int main(int argc,char **argv)
  
  printf("Hello Linux\\n");
  
  要编译这个程序,我们只要在命令行下执行:
  gcc -o hello hello.c
    gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程
  序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示
  我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.
    gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们
  已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出
  目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提
  供我们以后对程序进行调试的信息.
    知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你
  想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说
  明.
  2.Makefile的编写
  假设我们有下面这样的一个程序,源代码如下:
  
  #include "mytool1.h"
  #include "mytool2.h"
  int main(int argc,char **argv)
  
  mytool1_print("hello");
  mytool2_print("hello");
  
  
  #ifndef _MYTOOL_1_H
  #define _MYTOOL_1_H
  void mytool1_print(char *print_str);
  #endif
  
  #include "mytool1.h"
  void mytool1_print(char *print_str)
  
  printf("This is mytool1 print %s\\n",print_str);
  
  
  #ifndef _MYTOOL_2_H
  #define _MYTOOL_2_H
  void mytool2_print(char *print_str);
  #endif
  
  #include "mytool2.h"
  void mytool2_print(char *print_str)
  
  printf("This is mytool2 print %s\\n",print_str);
  
  当然由于这个程序是很短的我们可以这样来编译
  gcc -c main.c
  gcc -c mytool1.c
  gcc -c mytool2.c
  gcc -o main main.o mytool1.o mytool2.o
    这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一
  下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重
  新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我
  去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情
  想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一
  个一个的去编译?
    为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们
  只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先
  编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个
  Makefile的文件是:
  # 这是上面那个程序的Makefile文件
  main:main.o mytool1.o mytool2.o
  gcc -o main main.o mytool1.o mytool2.o
  main.o:main.c mytool1.h mytool2.h
  gcc -c main.c
  mytool1.o:mytool1.c mytool1.h
  gcc -c mytool1.c
  mytool2.o:mytool2.c mytool2.h
  gcc -c mytool2.c
    有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们
  只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其
  它的文件她连理都不想去理的.
    下面我们学习Makefile是如何编写的.
    在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖
  关系的说明.一般的格式是:
  target: components
  TAB rule
    第一行表示的是依赖关系.第二行是规则.
    比如说我们上面的那个Makefile文件的第二行
  main:main.o mytool1.o mytool2.o
    表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o
  mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命
  令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o
  mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键
  Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:
    $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.
    如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:
  # 这是简化后的Makefile
  main:main.o mytool1.o mytool2.o
  gcc -o $@ $^
  main.o:main.c mytool1.h mytool2.h
  gcc -c $<
  mytool1.o:mytool1.c mytool1.h
  gcc -c $<
  mytool2.o:mytool2.c mytool2.h
  gcc -c $<
    经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里
  我们学习一个Makefile的缺省规则
参考技术A 看一下链接相关参数:

https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
http://www.rapidtables.com/code/linux/gcc/gcc-l.htm

linuxc与普通的c语言有啥不一样?

没有普通的C。C语言就是C语言,不同的地方就是平台不同问题大致可以说是这样吧:linuxC与windows下C有什么区别其实没什么区别就都是C语言。非要说区别那就是平台不同,调用的API不同。linux有自己的API。windows也有自己的API例如... 查看详情

linux下c编程怎么编译

...  1.源程序的编译    在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器.下面  我们以一个实例来说明如何使用gcc编译器.  假设我们有下面一个非常简单的源程序(hello.c):  intmain(intargc,char**argv)  ... 查看详情

g++和gcc和c,c++有啥区别的

G++和GCC和C,C++有什么区别的G++和C++都是C++语言的编译器,二者基本相同。而GCC和C都是C语言编译器,而这差别实际也不大。尽管C++规范中兼容绝大部分C的用法和几乎全部函数,但毕竟还是有更改的地方。记住,如果你在学C或C++,... 查看详情

linux终端下如何进行c语言编译

...要在代码框内写一个简单的C源程序。3、在程序中使用了C语言中的数学开方函数,sqrt(),所以需要引入math.h头文件。4、写完源程序之后,我们对其进行编译,如果使用通常的编译语句,【gccmath.c-omath】进行编译,会出现错误;... 查看详情

linux下如何运行可执行文件

...开始编译源文件。在终端中输入:gcctest.cgcc是linux自带的c语言编译器。如果是windows则要用ide工具来编译。linux系统一般写C语言用gcc+vim+gdb三个自带的工具就可以了。4、打完gcctest.c编译完C源文件。然后就可以看见a.out的文件。一... 查看详情

如何在64位的linux系统上使用汇编和c语言混

...指令1nasm-felffoo.s-ofoo.o2gcc-cbar.c-obar.o3ld-s-ofoobarbar.ofoo.o汇编语言用nasm编写并用nasm编译器编译,而C语言用的是gcc编译,这些都没有问题,但是在链接的时候出错了,提示如下:ld:i386architectureofinputfile`foo.o'isincompatiblewithi386:x86-64ou... 查看详情

用c语言编写的程序,能不能直接在linux下运行?

...可以直接拿到linux下执行。3.在linux系统下可不可以执行C语言写的程序。当然应该不可能是地三个意思了。如果是第二个意思,那么答案是:肯定不能执行。因为C语言是于系统有关的。所以在window下编译的可执行文件,和在linux... 查看详情

在linux下如何开发c程序?

...Linux还提供了调试工具GDB和程序自动维护工具Make等支持C语言编程的辅助工具。如果想要了解GCC的所有使用说明,使用以下命令:$mangcc参考技术Agccfirst.C-ofirst说明:1>编译当前目录下、名字叫做first.C的c源文件;2& 查看详情

带有 -std=c99 的 GCC 抱怨不知道 struct timespec

...-04-2123:18:33【问题描述】:当我尝试在Linux上使用gcc-std=c99编译它时,编译器抱怨不知道structtimespec。但是,如果我在没有-std=c99的情况下编译它,一切正常。#include< 查看详情

linux的终端怎么运行c语言

我编好了一个C程序,然后输入到Linux的终端上,但是我不知道怎么运行请哪位高手指导指导。详细点。。。。打开终端然后VI环境下编译运行一.常用编译命令选项假设源程序文件名为test.c。1.无选项编译链接用法:#gcctest.c作用:... 查看详情

把gcc的编译信息重定向到一个文件

最近在Linux下进行编程,很多写好的代码要进行编译。在链接很多文件的时候,经常会出现很多的错误,而Linux下终端显示是有限的,因此每次调试的时候如果错误太多就会很不方便。如果使用简单的管道重定向如下:gcc-ctest.c>... 查看详情

如何在linux中安装gcc编译器?

...了。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。GCC3.4.0比以前版本更好地支持了C++标准。本文以在RedhatLinux上安装GCC3.4.0为例,介绍了GCC的安装过程。安装之前,系统中必须... 查看详情

linux交叉编译工具链和gcc是啥关系啊

我知道交叉编译工具链是面向另一个平台的,可是,我不明白,这个交叉编译工具链主要包括什么啊,我们平时再LINUX下用的GCC只是一个编译工具是吧编译工具链一般最简化的为binutils+gcc+glibc+kernel-header组合的环境。GCC就是编译... 查看详情

“linux”怎么编译c的源程序的?“gcc”编译命令是啥?

...:gcc-ohellohello.c命令如下:gcc-chellohello.c参考技术A初学者在编译的时候最好一步一步来,以hello.c为例:先将源文件编译成目标文件:gcc-chello.c上一步生成hello.o文件,再将目标文件编译成可执行文件:gcc-ohellohello.o 查看详情

linux下gcc的使用(一看就会系列)(代码片段)

...面意思可以知道它是一个编译器集。gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序。但是在这里,我们的嵌入式学习中,目前只去关注gcc在C语言方面的编译功能。目录一.预处理 二.编译... 查看详情

linux下intel的mkl编程代码,怎么样编译。c++和c语言代码

我安装了intel的mkl,但是知道怎么样调用命令运行程序。如果我的分别是.cpp文件和.c文件。怎么样在linux下运行。我知道c++的是g++-gXXX.cpp-XXX,那么加入mkl库函数怎么调用?还是-g吗?我用程序提供的例子都是错误的。求高手参考... 查看详情

gcc内置函数

在C语言写的程序中,有时候没有包含头文件,直接调用一些函数,如printf,也不会报错,因为GCC内置和一些函数。如果包含了头文件,则去第三方库中链接这个函数,不再使用GCC内置的函数。每个编译器的内置函数也不一样,... 查看详情

mingw怎么编译java,文件?

...三方C运行时(CRuntime)库。换句话说,是专门用来编译C语言的;如果想编译java,肯定要用java的编译器,(包含javaRuntime,简称jre),java的编译器通常包含在JDK中,JavaDevelopmentKit,即java语言开发工具包。总结:MinGW无法编译java... 查看详情