精华内容
下载资源
问答
  • 众所周知的真理—.so文件的编译确实费了不少力气,主要是对gcc... 例:c源程序为 getSum.c,则有:gcc -shared -fPIC -DPIC getSum.c -o getSum.so即可以将c源文件编译成可供python调用的so库文件,赶紧来享受c带来的...

    众所周知的真理—

    .so文件的编译确实费了不少力气,主要是对gcc编译知识的缺乏,网上的资料大多抄袭,源头错了,下游全部都是错的,在不断地百度之后,发现了一个可以用来编译.so的方法,特记录下来。 例:c源程序为 getSum.c,则有:

    gcc -shared -fPIC -DPIC getSum.c -o getSum.so

    即可以将c源文件编译成可供python调用的so库文件,赶紧来享受c带来的性能飚升的体验吧,ps:对ctypes不是很了解,正在学习中,又重新燃起对c语言学习的激情了。

    注:此编译仅限

    一个例子:

    getSum.c

    #include

    int getSum()

    {

    int sum = 0;

    int a,b;

    for(a=0;a<=100;a++)

    {

    sum += a;

    }

    return sum;

    }

    编译.so库文件

    gcc -shared -fPIC -DPIC getSum.c -o getSum.so

    ctypedemo.py文件调用

    # -*- coding: utf-8 -*-

    from ctypes import CDLL

    lib = CDLL("./getSum.so")

    print(lib.getSum())

    展开全文
  • @Linux中编译C源文件 目的: 记录Linux系统中编译C源文件的操作。 环境: 1.centos7 2.源文件准备如下。 main.c 调用另外三个文件内的函数。 #include<stdio.h> int main(){ int angle; void describe(); ...

    @Linux中编译C源文件

    目的:
    记录Linux系统中编译C源文件的操作。
    环境:
    1.centos7
    2.源文件准备如下。
    main.c
    调用另外三个文件内的函数。

    #include<stdio.h>
    
    int main(){
    	int angle;
    	void describe();
    	void sinValue(int angle);
    	void cosValue(int angle);
    	describe();
    	printf("please input angle");
    	scanf("%f", &angle);
    	describe();
    	sinValue(angle);
    	cosValue(angle);
    }
    

    describe.c
    定义一个函数,输出程序功能。

    #include<stdio.h>
    
    int describe(){
    	printf("this program calculate sin value and cos value of angle.");
    }
    

    sinValue.c
    定义一个函数,用于定义给定的角度的sin值。

    #include<stdio.h>
    #include<math.h>
    
    void sinValue(int angle){
    	double value;
    	double radian;
    	radian = angle*3.14/180;
    	value = sin(radian);
    	printf("sin:%f", value);
    }
    

    cosValue.c
    定义一个函数,用于计算给定角度的cos指。

    #include<stdio.h>
    #include<math.h>
    
    void cosValue(int angle){
    	double value;
    	double radian;
    	radian = angle*3.14/180;
    	value = cos(radian);
    	printf("sin:%f", value);
    }
    

    **备注:**以上文件位于同一个文件夹内。
    方法:
    方法一:
    直接使用GCC编译程序。
    1.gcc -c *.c
    将所有以c为扩展名的文件全部编译为目标文件,o
    2.gcc -o main *.o -lm
    将目标文件连接为main可执行文件,其中-lm代表libm.so这个库,因为使用了sin和cos,而它们在libm.so这个库里面。不指定路径时默认为/lib和/usr/lib。可以使用-L指定库的查找路径。
    方法二:
    使用make和makeFile进行编译。
    1、在目录内新建makeFile文件。

    main: main.o describe.o sinValue.o cosValue.o
    	gcc -o main main.o describe.o sinValue.o cosValue.o -lm
    
    clean:
    	rm -f main *.o 
    

    2、使用make main进行编译生成main文件。

    展开全文
  • 使用CMD命令编译C源文件 cl /c只编译,生成obj文件,不链接   link 链接,生成当前平台可执行的文件   cl /p 查看预处理指令,并且生成*.i文件 Helo world程序解析 ① #include 表示引用自环境...

    使用CMD命令编译C源文件

    cl /c只编译,生成obj文件,不链接

     

    link 链接,生成当前平台可执行的文件

     

    cl /p 查看预处理指令,并且生成*.i文件

    Helo world程序解析

    ①   #include <stdio.h>

    < > 表示引用自环境变量中,环境变量由编译器在安装时,自动写入系统。加载顺序为:A、环境变量 B、当前目录

    若为“ ”的形式,则表示引用来自当前目录或者具体某个位置的。加载顺序为:A、当前目录 B环境变量

     

    Stdio.h一般来自于编译器目录下,如VS2013所附带的:

    include的本质作用是将外部文件的方法或者函数引用到项目文件中来,红色部分是项目文件本身,绿色部分是编译后,编译器自动将stdio.h文件引用添加进项目中

     

    ②   int main()

    main函数是用户入口,C程序并不是从main函数开始首先加载的,main函数也是被调用函数,调用它的不是用户而是C运行时库——crt0.c

    ③   printf("Helloworld!");

    一般用于向标准输出设备按规定格式输出信息。其调用函数传入的第一个参数是file类型,如下图:

    这是因为系统在向设备输出信息的时候,不同设备的操作方式不同,需要根据各家设备提供商提供的驱动文件(可以理解为里边包含了设备的操作方法)来操作设备,输出信息,所以才是file类型。

     

    ④   return 0;

    待补充~~~

    展开全文
  • Linux下使用make命令编译c源文件! 文章目录一、概述二、关于程序的编译和链接三、Makefile 介绍3.1、Makefile的规则四、一个例子参考文章 一、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,...
    Linux下使用make命令编译c源文件!

    一. 概述

    • 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
    • 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
    • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
    • 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的POSIX.2。

    二. 关于程序的编译和链接

    • 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
    • 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。
    • 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
    • 总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.
    • 言归正传,GNUmake有许多的内容,闲言少叙,还是让我们开始吧。

    三. Makefile 介绍

    • make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感性认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
    • 1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
    • 2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
    • 3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
    • 只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

    3.1. Makefile的规则

    • 在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。
     target ... 
     prerequisites ...
     command...
    
    • target也就是一个目标文件,可以是object file,也可以是执行文件。还可以是一个标签(label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
    • prerequisites就是,要生成那个target所需要的文件或是目标。
    • command也就是make需要执行的命令。(任意的shell命令)
    • 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于 prerequisites中的文件,其生成规则定义在 command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是makefile的规则。也就是makefile中最核心的内容。
    • 说到底,makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是makefile的主线和核心,但要写好一个makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。

    四. 实战例子

    4.1. 以三个文件为例:

    • 源文件max.c
    int max(int a,int b)
    {
    	if(a > b){
    		return a;
    	}else{
    		return b;
    	}
    }
    
    • 源文件min.c
    int min(int a,int b)
    {
    	if(a < b){
    		return a;
    	}else{
    		return b;
    	}
    }
    
    • res.h
    int max(int a,int b); 
    int min(int a,int b);
    
    • 源文件res.c
    #include <stdio.h>
    #include "res.h"
     
    int main()
    {
        int a = 99;
        int b = 88;
        int maxVal = max(a,b);
        int minVal = min(a,b);
        printf("the max value is %d\nthe min value is %d\n",maxVal,minVal);
        return 0;
    }
    
    • 在res.c中引用了两个max和min,分别计算两个整型的最大和最小值

    4.2. 如果不使用make命令,打印res.c的最终结果需要执行步骤

    • ①先分别编译max.c和min.c为max.o和min.o文件。
    • ②再编译res.c生成可执行文件,然后运行可执行文件即可得到结果。

    4.3. 如果使用make命令编译过程

    • ①创建并编辑Makefile文件;将所有的编译命令放入,必须用vim编译器; 规则格式为:
    <生成可执行二进制文件名>: <引入的.o文件1> <引入的.o文件2> <c源文件>
    <gcc执行命令>
    
    # this is a make file
    res.out: max.o min.o
    	gcc max.o min.o res.c
    max.o: max.c
    	gcc -c max.c
    min.o: min.c
    	gcc -c min.c
    

    4.4. 执行命令如下

    zhangkf@john:~/yolov3_darknet$ ls
    darknet-master  makefile  max.c  min.c  res.c  res.h
    zhangkf@john:~/yolov3_darknet$ make
    gcc -c max.c
    gcc -c min.c
    gcc max.o min.o res.c
    zhangkf@john:~/yolov3_darknet$ ls
    a.out  darknet-master  makefile  max.c  max.o  min.c  min.o  res.c  res.h
    zhangkf@john:~/yolov3_darknet$ ./a.out 
    the max value is 99
    the min value is 88
    zhangkf@john:~/yolov3_darknet$ 
    
    
    • 最终make工具会根据Makefile的规则执行所有的编译,并根据引用对未编译的引用文件进行编译。

    4.5. 注意

    • Linux若没有自带make工具,则需要进行安装,使用make -v可以查看版本
    apt-get install make
    make -v
    

    参考文章

    此博客参考了下面作者的文章,表示感谢!

    展开全文
  • 源文件编译,即在运行前要对源代码进行编译链接,然后才能运行。编译利用编译程序从源语言编写的源程序产生目标程序的过程,也是用编译程序产生目标程序的动作。编译就是把高级语言变成计算机可以识别的2进制语言...
  • Linux下使用make命令编译c源文件

    千次阅读 2018-05-15 13:00:48
    make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。make命令唯一读取的文件是Makefile,在较大的项目中,有些文件没有编译有些编译...以三个文件为例:max.c:i...
  • 问题描述:在Linux下用eclipse cdt插件开发c,main函数所在的文件引用了其他c文件中的函数,编译结果显示“undefined reference to”,头文件已经包含了。 编译显示结果: make all Making all in src make[1]: ...
  • -> % readelf -h a.out ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ...
  • C语言源文件到汇编语言的编译

    千次阅读 2016-11-04 23:08:17
    这是我们经常写的最简单的程序: #include int main() { printf("Hello,world!\n");...在我们使用gcc指令来编译C语言源文件的...[root@localhost kangkang]# gcc -o hello hello.c //#编译C代码生成目标文件为hello。
  • Linux下C语言源文件编译的四个阶段: /* 2 * C语言开始,先包含需要调用的函数所在声明的头文件 3 * stdio.h头文件的路径为usr/include/st...
  • 其他編程語言問題描述:大家好,有个编译C源文件的问题,我现在在用Dev-C++来编译C语言源文件,可是有时候不管我是在代码后加个getchar()或者getch()或者system("pause"),文件在编译运行以后都是一闪而过的...
  • 编译Java源文件

    2014-05-02 08:40:43
    JDK:Java Development Kit(Java开发工具包)的缩写。 J2SE:Java 2 Standard Edition-Java2标准开发环境。 ...C:\dollapp\src\com\abl\dollapp\doll\Doll.java \\指定编译源文件路径
  • VS2015编译lua源文件

    千次阅读 2016-09-01 17:20:08
    一、编译lua源文件网上面本来就有Lua编译过后的文件,拿过来可以直接调用,但是,某天我心血来潮,决定自己编一个,这样省得去找这样的文件了(貌似变懒了)。首先从官网下载最新的lua源文件 地址为: ...
  • javac编译java源文件

    2016-10-16 22:58:36
    假设有一个java源文件,代码如下 ... public class C{ } static class D{ } } class E{ } 一个java源文件只能有一个public 类 使用javac命令执行以上java文件,会生成如下5个class文件 1.A.cla
  • 利用makefile文件编译c++源文件

    万次阅读 2017-07-08 00:22:12
    在Linux下,利用makefile文件编译链接c/c++源文件,并生成可执行文件 本文介绍了makefile文件的写法和相应参数的含义以及如何生成、使用so库文件
  • 今天在学习redis的时候,在linux环境下使用gcc编译redis源文件报如下的错误: 解决: 通过查阅资料发现,编译redis6.0.9需要使用版本较高的gcc,而CentOS通过命令行下载的gcc版本并不足以支持编译redis源文件,通过...
  • C:\Users\Administrator\AppData\Local\QtMsBuild\qt_vars.targets(246,5): error : 此编译源文件可以在以下位置找到:“C:\Users\Administrator\AppData\Local\Temp\88bf35cb-38ce-41c4-a691-27d54fc325ed.txt” ...
  • 在cmd下编译Java源文件文件出现程序包xxxx不存在

    千次阅读 多人点赞 2019-04-17 23:15:37
    编译Java源文件时遇到程序包不存在的问题,我们应该如何解决呢?话不多说,开始对这个问题进行讲解,真心希望大家能有所收获 在最近的jsp学习过程中,突然遇到程序包不存在问题,如下所示 D:\apache-tomcat-...
  • dev运行时出现源文件编译的情况是什么原因,应该怎么样解决呢#includeintmain(){intday,month,year,sum,leap;printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n");scanf("%d,%d,%d",&year,&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 211,305
精华内容 84,522
关键字:

如何编译c源文件