编程论坛's Archiver

boshido 发表于 2008-7-3 09:43

总结一些思考的问题!!!大家一起讨论!

感谢大家对于在下的LinkError一帖的积极讨论和指教,论坛的氛围很积极,我也将一些问题的总结与大家分享讨论,还望牛人积极参与意见。谢谢

很多编写代码的初学者都是从单线程,单文件开始的。比如在一个文件中声明子函数,主函数,结构体等等,大家都调试过。

之后开始写多个文件链接,实现自己的库和函数包。这时问题就来了,以前老谭的书上似乎没有说过啊?于是就到处看一些别人的代码,借鉴,模仿,学习,最终自己掌握。

我周围的人都是如此,不知其他高手牛X有没有更好的方法,如果有大家一起来说说。

过去,我也认为我掌握了。因为以前用TC和VC等等,都可行。直到最近,换了个电脑,换了个编译平台,问题出现了。如我在LinkError一问中说描述的,编译通过,可是文件链接有问题。以前没有遇到过,现在还真是有些措手不及。

后来下载了一个TC30,跑一遍,仍然是编译通过,运行时出现LinkError:Undefined symbol _show
show()是我在其他文件show.c中写的一个函数,在show.h中有声明,void show(void);而且在同一个目录下面,究竟问题出在哪里呢?

如果是编译器设置的问题,对于编译器,包含文件编译时,有些什么需要的设置没有。我现在是按照默认的设置。C的库目录、Include目录等目录设置全都检查过了。可是编译通过,运行链接有问题这其中到底会是哪些地方没顾忌到呢?

如果是语法的问题,文件包含的标准过程和声明规范是什么样的呢?

请大家说说谢谢。

现在我就先说说我的包含过程吧。
1、将void show(void) 函数写入文件show.c保存
2、建立show.h。声明 void show(void);
3、在main.c中,用预编译命令#include "show.h"将show.h包含进去
4、编译通过
5、运行

就是这么一个流程,可是在第5步出现了问题总是出现Undefined Symbol _show

望大家积极讨论,不吝赐教!谢谢。

ioriliao 发表于 2008-7-3 09:51

//show.h
#ifndef SHOW_H
#define SHOW_H
extern void show(void);
#endif
//show.c
#include "show.h"
void show(void)
{
   .....
}

//main.c
#include "show.h"
int main(void)
{
    return 0;
}

ioriliao 发表于 2008-7-3 09:56

如果linkerror,那么是平台的一些问题.
我以前在devc就碰到过.
如果你是用devc,那么你不要一个一个文件地建,
而是先建立一个工程文件,然后添加相关的.h or .c

boshido 发表于 2008-7-3 10:08

已经如ioriliao兄做了修改,
#include <stdio.h>
#include "show.h"

void main()
{
show();
}

用Broland C++编译无错,运行时出现
Undefined Symbol _show in module MAIN.c
看来问题还是存在。还需要探讨和思考!

boshido 发表于 2008-7-3 10:13

另外
#ifndef SHOW_H
#define SHOW_H
中,SHOW_H从没有用过,这两个宏定义起什么作用呢?

ioriliao 发表于 2008-7-3 10:30

你下载个devc++平台回来吧
borland的东西对初学者不友好.

boshido 发表于 2008-7-3 10:33

感谢您热情的回复。

ioriliao 发表于 2008-7-3 10:34

如果像你这种帖子我是很热情回复的,那些作业帖就不同了.

sglancer 发表于 2008-7-3 11:26

你编译和link的命令行是什么?

下面是那3个文件, 我用gcc编译,命令行是
gcc -o main.exe show.c main.c
运行main.exe 没有问题

//show.h
#ifndef SHOW_H
#define SHOW_H
extern void show(void);
#endif
//show.c
#include "show.h"
void show(void)
{
   printf("hello world!\n");
}

//main.c
#include "show.h"
int main(void)
{
    show();
    return 0;
}

ioriliao 发表于 2008-7-3 11:31

呵呵...楼主应该不是用命令行编译的.
如果是的话肯定不会出现link error.
而其用的borlandc平台又没有智能link(估计的^_^);
所以error.所以我叫其下载个友好点的平台回来.

qGemini 发表于 2008-7-3 11:39

很简单,楼主肯定不是建立工程的方式

界水乘风 发表于 2008-7-3 12:30

这个和建不建工程没什么关系。

你的编译器是按照C++的语法进行编译的,所以有两种更正方法。

1. 把.c文件改成.cpp文件。

2. 更改头文件。改成:
#ifndef SHOW_H
#define SHOW_H

#ifdef  __cplusplus
extern "C" {
#endif

extern void show(void);

#ifdef  __cplusplus
}
#endif

#endif

ioriliao 发表于 2008-7-3 15:14

原来如此,受教了.
我先前都还以为是与建不建工程的问题.

boshido 发表于 2008-7-4 10:21

不胜感激,
不过由于是关于硬件代码的编程,可能还有所不同,至于
#ifndef SHOW_H
#define SHOW_H
是不是指如果没有定义Show.h就告诉编译系统需要show.h文件?
是不是呢?

ioriliao 发表于 2008-7-4 10:44

是的.
其实这个一开始是不好理解的
怎么样才知道没有定义或者定义了呢
且看:
//test1.h
#include "show.h"

//main.c
#include "show.h"    //一开始没有定义 SHOW_H,那么定义SHOW_H
#include "test1.h"   //到此时已经定义了SHOW_H,所以test1.h里的show.h里的声明代码就不会编译到,那么就不会出错了.
int main(void){
    return 0;
}

StarWing83 发表于 2008-7-4 10:48

要么写makefile,要么用命令行编译

如果都不想就用IDE吧,比如VC或者DevC++。

我现在一般是写makefile的。

boshido 发表于 2008-7-5 13:09

讨论的氛围实在是很热闹啊!呵呵。
其实编程当中有许多细节,平时都不注意,在一些专业的公司里却十分看重这个的。
至于写makefile,实在是不太常见,似乎周围的人甚至还有不知道这个的。即使知道也仅仅是个名词,具体的规范和操作都没有实践过。

boshido 发表于 2008-7-9 13:18

不错的讨论!

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.