当前位置: 技术问答>linux和unix
gcc 写程序的时候怎么在这个文件中调用其他文件中的函数
来源: 互联网 发布时间:2016-08-02
本文导语: //myfile.h #ifndef MY #define MY m(); n(); #endif //1.c #include "myfile.h" #include m() { printf("mn"); } //2.c #include "myfile.h" #include n() { printf("nn"); } //3.c #include #include "myfile.h" main() { m(); n(); printf("okn"); } 像这种程...
//myfile.h
#ifndef MY
#define MY
m();
n();
#endif
//1.c
#include "myfile.h"
#include
m()
{
printf("mn");
}
//2.c
#include "myfile.h"
#include
n()
{
printf("nn");
}
//3.c
#include
#include "myfile.h"
main()
{
m();
n();
printf("okn");
}
像这种程序在windows下的VC中直接编译3.c就可通过,库在linux下用$gcc 3.c提示:
In file included from 3.c:2:
myfile.h:3: 警告:数据定义时没有类型或存储类
myfile.h:4: 警告:数据定义时没有类型或存储类
/tmp/ccCuMrN9.o: In function `main':
3.c:(.text+0x12): undefined reference to `m'
3.c:(.text+0x17): undefined reference to `n'
这是为什么?难道在linux下只有先把1.c和2.c编译成动态库编译3.c时引用动态库才能生成最终的可执行文件吗?
#ifndef MY
#define MY
m();
n();
#endif
//1.c
#include "myfile.h"
#include
m()
{
printf("mn");
}
//2.c
#include "myfile.h"
#include
n()
{
printf("nn");
}
//3.c
#include
#include "myfile.h"
main()
{
m();
n();
printf("okn");
}
像这种程序在windows下的VC中直接编译3.c就可通过,库在linux下用$gcc 3.c提示:
In file included from 3.c:2:
myfile.h:3: 警告:数据定义时没有类型或存储类
myfile.h:4: 警告:数据定义时没有类型或存储类
/tmp/ccCuMrN9.o: In function `main':
3.c:(.text+0x12): undefined reference to `m'
3.c:(.text+0x17): undefined reference to `n'
这是为什么?难道在linux下只有先把1.c和2.c编译成动态库编译3.c时引用动态库才能生成最终的可执行文件吗?
|
像这种程序在windows下的VC中直接编译3.c就可通过
=================================================
非也非也。 windows 中 vc 并非只编译了 3.c 其他文件也编译了。
只不过编译器帮你做了,你不知道而已。
linux 下,你需要先分别把 1 2 编译成 .o 文件,
然后和 3.o 链接 在一起就能执行了, 不需要弄成动态库。
=================================================
非也非也。 windows 中 vc 并非只编译了 3.c 其他文件也编译了。
只不过编译器帮你做了,你不知道而已。
linux 下,你需要先分别把 1 2 编译成 .o 文件,
然后和 3.o 链接 在一起就能执行了, 不需要弄成动态库。
|
过程:
1.c和.h文件编程产生1.o文件
2.c和.h文件编程产生2.o文件
3.c和.h文件编程产生3.o文件
再将三个.o文件链接成一个可执行文件
1.c和.h文件编程产生1.o文件
2.c和.h文件编程产生2.o文件
3.c和.h文件编程产生3.o文件
再将三个.o文件链接成一个可执行文件
|
楼上说的对 看了楼主还不怎么会使用gcc
为了方便楼主 给你写了一个小的Makefile 基本上可以通用
把下面的代码保存为Makefile的文件 然后执行命令行make 就给你编译好了(就是楼上说的那些步骤)
代码中的name换成你想编译成名字
然后./name 就可以执行了
为了方便楼主 给你写了一个小的Makefile 基本上可以通用
把下面的代码保存为Makefile的文件 然后执行命令行make 就给你编译好了(就是楼上说的那些步骤)
代码中的name换成你想编译成名字
然后./name 就可以执行了
CC=gcc
CFLAGS=-O2 -Wall
OBJC=$(patsubst %.c,%.o,$(wildcard *.c))
TARGET_FILE=name
$(TARGET_FILE):$(OBJC)
$(CC) $(CFLAGS) -o $(TARGET_FILE) $(OBJC)
$(OBJC):%.o:%.c
$(CC) $(CFLAGS) -c $