boshido 发表于 2008-7-2 13:13

为什么编译没错,运行时总是出现LinkError?

写了个代码,为什么编译没错,运行时总是出现LinkError?

//main.c

#include <stdio.h>
#include "show.h"
void main(void)
{
show();
}

//=============================================


//show.h
#include <stdio.h>

void show(void)

//================================================

//show.c
#include <stdio.h>
#include "show.h"
void show(void)
{
printf("\nLink has been established.\n");
}
//=================================================

编译没有错误,但是运行时总是出现 Undefined Symbol _show(referred from main.o)
求教了,谢谢,不胜感激。

界水乘风 发表于 2008-7-2 13:21

1. 申明少分号

2. 头文件重复包含

flyue 发表于 2008-7-2 14:17

哎,LZ这个代码不是你自己写的吧?是不是按书上写的?
你看//main.c和//show.h是告诉你这片代码要放在不同的文件里地,你如果放在同一个文件,那当然会错误拉
void show(void)
这里少了“;”号

a54344071 发表于 2008-7-2 14:54

编译没有错误,应该不是;号的问题,我想应该是头文件的事

niuwen1 发表于 2008-7-2 16:07

LZ只要在show.h這個文件中包含#include <stdio.h>就可以了,還有這個例子是訓練寫程序的規范,可以在show.h中再加個預編譯的處理,可以防止一些重復包含的問題

cmgycmgy22 发表于 2008-7-2 17:24

楼主能写出这样的程序,境界在我之上

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

我是将main.c show.c show.h等文件放入不同的文件的,“;”在实际程序中也是加的,可是还是出现LinkError: Undefined Symbol _show
实在是无语。

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

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

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

还是很感谢大家的积极讨论。

中学者 发表于 2008-7-5 13:32

会不会是void的缘故.....C我不是很了解 - -

xcgoner 发表于 2008-7-6 14:20

这个嘛,其实是个很简单的问题,看你的样子就知道不是在写一个工程,大概是用tc/bc/Dev C之类的吧,不是工程的话你必然只编译运行了main.c一个文件,且其中只调用了一个show.h,而没有调用show.c是吧?不是工程的话他是不会把这两个文件连接到一起的噢。。。。。。所以把程序改成这样:
//main.c

#include <stdio.h>
#include "show.h"
void main(void)
{
show();
}

//=============================================


//show.h
#include <stdio.h>

void show(void)

void show(void)
{
printf("\nLink has been established.\n");
}
//================================================
不要show.c了,把定义全写在头文件里,顺便提一下,只有一句话的函数最好用#define宏定义来写,效率跟高噢。。。。。。

coming 发表于 2008-7-6 23:28

重建一个工程试试行不行,我有的时候写程序,开始还好好的,改改虽然没有错了,就老是显示连接错误,但是我重建了一个就好了,你试试吧

StarWing83 发表于 2008-7-6 23:56

[quote][bo][un]flyue[/un] 在 2008-7-2 14:17 的发言:[/bo]

哎,LZ这个代码不是你自己写的吧?是不是按书上写的?
你看//main.c和//show.h是告诉你这片代码要放在不同的文件里地,你如果放在同一个文件,那当然会错误拉
void show(void)
这里少了“;”号 [/quote]

flyue你经验不足啊……会出这样的错误显然是因为放在了多个文件内嘛……

如果是VC6,检查是不是所有的文件都已加到工程中,这一点很重要!!
如果是命令行,参考下面的语句:

VC编译器:
cl.exe /omain.exe main.c show.c show.h

GCC编译器:
gcc.exe -omain.exe main.c show.c show.h

StarWing83 发表于 2008-7-6 23:56

[quote][bo][un]xcgoner[/un] 在 2008-7-6 14:20 的发言:[/bo]

这个嘛,其实是个很简单的问题,看你的样子就知道不是在写一个工程,大概是用tc/bc/Dev C之类的吧,不是工程的话你必然只编译运行了main.c一个文件,且其中只调用了一个show.h,而没有调用show.c是吧?不是工程的话他 ... [/quote]

C++可以这样,C这样做会演变成一场灾难……

woshiyun 发表于 2008-7-7 09:25

[quote][bo][un]StarWing83[/un] 在 2008-7-6 23:56 的发言:[/bo]
如果是VC6,检查是不是所有的文件都已加到工程中,这一点很重要!!
[/quote]

没必要建工程的,夸张了,
就和一般的文件一样的编译就可以了。

StarWing83 发表于 2008-7-7 13:07

LS:这样,就只能编译一个文件而已,多个文件,必须建立工程……

woshiyun 发表于 2008-7-7 13:12

[quote][bo][un]StarWing83[/un] 在 2008-7-7 13:07 的发言:[/bo]

LS:这样,就只能编译一个文件而已,多个文件,必须建立工程…… [/quote]

你自己试试吧,下面是3个文件,show.h, show.cpp, main.cpp, 放在同一个文件夹下,不用建立工程,看看能不能编译,运行。

// File: show.h
#ifndef SHOW_H
#define SHOW_H

#include <stdio.h>

extern void show(void);

#endif

// File: show.cpp
#include "show.h"

void show(void)
{
    printf("Hello World!\n");
}

// File: main.cpp
#include "show.h"

int main(void)
{
    show();
    return 0;
}

界水乘风 发表于 2008-7-7 13:27

无须建工程,
至于MS后面出的编译器,
强制要给你建,
那是没有办法的事情了。

VC6是没有必要的。

StarWing83 发表于 2008-7-7 14:29

不用VC6,主要是Vista下面用VC6很麻烦,还必须自己设置路径……

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

是这个道理,其实show.c里面还有大量代码,这里只是简化了。工程也建立了。是不是需要在默认目录下编译呢?

页: [1]

编程论坛