关于在linux下用gcc编译头文件的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于在linux下用gcc编译头文件的问题。相关的知识,希望对你有一定的参考价值。

有node.h prepare.h list.h file.h 这四个头文件, prepare.h中用到了node.h, list.h中用到了preapre.h , file.h中用到了list.h ,怎么用gcc对这四个头文件进行编译。

我用一个例子来告诉你怎么样在 C++ 里使用C的头文件/函数。

比方说我有一个C的头文件叫 c.h, C的源码文件叫 c.c,内容分别是

c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_

#include <stdio.h>

extern int test(int a);

#endif

c.c:
#include "c.h"

int test(int a)

printf("A = %d\n", a);
return a*a;


现在我想在c++中使用c.c中提供的函数test(),我的c++文件名字叫 a.cpp,那么里面跟C有关的部分就要用 extern "C" 大括号括起来,看看我的
a.cpp:
#include <iostream>
using namespace std;

extern "C"

#include "c.h"


int main()

int b = 12;

b = test(b);

cout<<"b = "<<b<<endl;
return 0;


看到了吧,#include "c.h" 被 extern "C" 括起来了。

然后是如何编译,先把C文件编出目标文件(.o)来
gcc -c c.c
你会看到生成了 c.o,其实,有目标文件就够了,如果你一定要做成(静态/动态)库文件,也是可以的,不过我这里就不深入了,做成库和直接用目标文件对解决你的问题没有任何区别。

然后再编译C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在编译 a.cpp 的时候把C生成的 c.o也加上了。 然后生成 可执行的 hello, 运行
./hello
就可以看到
A = 12
b = 144

关于创建静态库,假定你有3个C文件, a.c, b.c, c.c 提供了你C++要用到的接口,那么可以把这三个C文件编译出来的目标文件放到一个库文件里供C++使用,方法为

先编译出目标文件
gcc -c a.c b.c c.c

这时候你应该看到有 a.o b.o c.o了

然后创建库文件
ar cr libtest.a a.o b.o c.o
这三个目标文件就放入 libtest.a 这个静态库中了,然后编译C++程序 (你的C++程序应该已经按照我前面说的用 extern "C" 把C的接口都括起来了),假定你的 libtest.a 放在 /home/aaa/lib下

g++ -o my.exe my.cpp -L/home/aaa/lib -ltest

就会生成可执行文件 my.exe了。
参考技术A

在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,就可以看到程序编译后的输出结果“Hello Linux”。

参考技术B c代码里包含头文件,编译用gcc编译c文件,多个c文件自己写个makefile,-I可以指定头文件目录
比如gcc -I/my/include/file xxxxxxxxxxx ,把头文件放一个目录就行了

在Linux下用gcc编译hello world

1. 确保Linux系统里已经装好了gcc

测试:输入gcc后是如下的结果就说明已经安装成功

技术分享图片

2. 创建HelloWorld.c

使用 touch 创建一个空文件;

用vim编辑

 

技术分享图片

按下A或者I 插入

并输入代码

技术分享图片

输入完成之后,按ESC退出

并输入:wq(小写)

w:write

q:quit

技术分享图片

用GCC编译

gcc -Wall HelloWorld.c

-Wall 编译后显示所有警告

./a.out

技术分享图片

.out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。
在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。执行时必须键入命令 ./a.out,即要带上扩展名,如果键入./a 则不正确,因为它寻找a这个文件,而不是a.out这个文件。

所以如果要自己制定可执行文件的名字可以采用如下的方式:

技术分享图片

-o 是输出参数,输出名字的参数,如果不加-o 参数。命令:gcc helloworld.c 则会生成a.out的可执行文件。

 而执行这个可执行文件可以采用如下的方式:

技术分享图片


实时上,上述过程有四个步骤, prepressing, compilation,assembly,linking

技术分享图片

 


以上是关于关于在linux下用gcc编译头文件的问题。的主要内容,如果未能解决你的问题,请参考以下文章

arm-linux-gcc工具链:汇编文件如何include c的头文件呢???

在Linux下用gcc编译hello world

问一下,为啥代码在RedHat里面gcc编译出错,提示找不到module.h等头文件

在cygwin下用gcc编译一个程序的详细步骤,求详解

如何解决gcc编译c程序找不到头文件的问题

gcc/g++程序的翻译(.c --;.exe)