当前位置:  技术问答>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时引用动态库才能生成最终的可执行文件吗?

|
像这种程序在windows下的VC中直接编译3.c就可通过
=================================================
非也非也。  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文件链接成一个可执行文件

|
楼上说的对 看了楼主还不怎么会使用gcc

为了方便楼主 给你写了一个小的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 $

    
 
 

您可能感兴趣的文章:

  • GCC编译程序时,有自定义头文件,提示找不到该头文件,但他就在这个目录中,如何设置GCC参数?
  • gcc编译时出错,gcc: installation problem, cannot exec `as': 没有那个文件或目录!!!求助呀呀!!!!!
  • 请问用GCC 编译,如何生成MAP文件?就是内存的分布映像文件?
  • 在Unix环境下用gcc如何编译成动态链接库文件?类似Windows下的DLL文件。
  • 请大家帮忙gnu ftp上gcc源码是哪个文件?
  • 在linux中"XXX.l"是什么文件(文件扩展名为L),用gcc怎么编译?谢谢大家!
  • 在gcc里面,用哪个参数将几个目标文件链成一个大的目标文件(不是最终的可执行文件)
  • gcc中,一个.c文件中的函数,如何调用另一个.c文件中的函数?
  • gcc生成什么样的目标文件?
  • gcc程序怎么不能将输出重定向到文件或管道呀,你们有这个问题吗?
  • 请教如何能把 gcc编译的所有信息存放到一个文件里
  • 使用gcc,如何在Solaris上生成so动态库文件?
  • gcc加什么选项可以把一个.c文件编译为相应的.o文件?
  • gcc的编译头文件问题
  • 关于用gcc(g++) 编译其它扩展名(比如hpp)的合法的源文件??
  • GCC是怎么通过.h文件找到C函数库的
  • 怎么将GCC的出错信息导入到文件中?
  • 请问:ubuntu下编译的openssl的.so文件放在那个目录 下阿?GCC如何导入.so的库文件?
  • 减小GCC编译的文件的大小
  • ubuntu gcc 找不到 stdarg.h文件
  • 请问make是如何调用gcc的啊
  • 请教gcc编程 问题 关于调用中断 实现 图形模式
  • 如何在gcc中调用静态库(.a)中的函数?谢谢!
  • g++能调用gcc编译出来的库中的函数吗?
  • 请问gcc有没有类似GetExitCodeProcess的函数,可以获得调用的外部程序的返回值呢?
  • gcc如何静态地调用 lstdc++库?
  • RedHat Linux 下怎么调用gcc 行编译器?
  • 64位机调用gcc -m32时出错
  • 关于GCC:如何定义函数的调用方式?
  • 请问gcc有没有类似CreateProcess的函数,可以获得调用的外部程序的进程ID呢?
  • 急:arm-linux-uclibc-gcc 生存so库,在运用程序调用报错。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 请问在REDHAT下使用gcc编译器用的是什么函数库,函数库的资料应该上哪儿找?
  • gcc编译的函数可不可以确定编译后的函数在文件中的顺序
  • 在linux编c程序,用gcc函数如何联接?
  • gcc的库函数找不到
  • 请问gcc一些库函数的source code在哪里?
  • gcc怎么查看某个函数包含在哪个头文件及其使用方法
  • GCC 怎么修改启动函数
  • gcc如何指定函数的calling convention,像VC那样的关键字?
  • 在GCC下怎样查找某个库函数的原型,或者位于那个头文件里面
  • linux中的gcc不支持变量随用随定义?必须放在函数开头?
  • 在linux中"XXX.l"是什么文件(文件扩展名为L),用gcc怎么编译?谢谢大家! iis7站长之家
  • 菜鸟问题, GCC 编译出的目标码中函数前面有没有下划线呀?
  • 有没有介绍gcc函数库的书
  • gcc有类似getch这样的函数吗?
  • gcc或g++在编译时能否生成类似vc里面的map文件?从而可以从崩溃地址知道是有哪个函数里面
  • linux环境下gcc编译器对sin函数出现的错误
  • 谁知道用gcc编译c++的程序是用什么选项去去掉自动给函数添加的前缀和后缀???
  • statfs函数在用arm-linux-gcc编译后?
  • sigqueue()函数在solaris 8下用GCC编译时出错
  • 太奇怪了,正在开发bootloader,gcc难道有内置的string的处理函数链接到我的程序中了?我根本没有链接C库啊。
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 命令:mips_fp_le-gcc,mipsel-gcc 是什么意思?跟一般的gcc有什么区别?
  • 怎样升级我的GCC呀,我用的RH7.2,GCC 2.96 ,我从网上下载了一个gcc-3.2.3.tar.gz
  • arm-elf-gcc 和 arm-linux-gcc有什么区别?arm-elf-gcc里的elf代表什么?
  • gcc-ccore、avr-gcc及arm-gcc的区别
  • gcc在哪里?bash:gcc:command not found
  • 如何删掉GCC3.0(我需要GCC2.0-----)
  • Windows版GCC TDM-GCC
  • 急问:如何卸掉gcc 3.2庄gcc 2.96
  • 有人遇到过吗,在安装GCC时提示,"checking gcc ...no "


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3