为什么编译没错,运行时总是出现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)
求教了,谢谢,不胜感激。
2. 头文件重复包含 哎,LZ这个代码不是你自己写的吧?是不是按书上写的?
你看//main.c和//show.h是告诉你这片代码要放在不同的文件里地,你如果放在同一个文件,那当然会错误拉
void show(void)
这里少了“;”号 编译没有错误,应该不是;号的问题,我想应该是头文件的事 LZ只要在show.h這個文件中包含#include <stdio.h>就可以了,還有這個例子是訓練寫程序的規范,可以在show.h中再加個預編譯的處理,可以防止一些重復包含的問題 楼主能写出这样的程序,境界在我之上 我是将main.c show.c show.h等文件放入不同的文件的,“;”在实际程序中也是加的,可是还是出现LinkError: Undefined Symbol _show
实在是无语。 请问,对于编译器,包含文件编译时,有些什么需要的设置没有。我现在是按照默认的设置。C的库目录、Include目录等目录设置全都检查过了。可是编译通过,运行链接有问题这其中到底会是哪些地方没顾忌到呢?
望大家不吝赐教!谢谢。 还是很感谢大家的积极讨论。 会不会是void的缘故.....C我不是很了解 - - 这个嘛,其实是个很简单的问题,看你的样子就知道不是在写一个工程,大概是用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宏定义来写,效率跟高噢。。。。。。 重建一个工程试试行不行,我有的时候写程序,开始还好好的,改改虽然没有错了,就老是显示连接错误,但是我重建了一个就好了,你试试吧 [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 [quote][bo][un]xcgoner[/un] 在 2008-7-6 14:20 的发言:[/bo]
这个嘛,其实是个很简单的问题,看你的样子就知道不是在写一个工程,大概是用tc/bc/Dev C之类的吧,不是工程的话你必然只编译运行了main.c一个文件,且其中只调用了一个show.h,而没有调用show.c是吧?不是工程的话他 ... [/quote]
C++可以这样,C这样做会演变成一场灾难…… [quote][bo][un]StarWing83[/un] 在 2008-7-6 23:56 的发言:[/bo]
如果是VC6,检查是不是所有的文件都已加到工程中,这一点很重要!!
[/quote]
没必要建工程的,夸张了,
就和一般的文件一样的编译就可以了。 LS:这样,就只能编译一个文件而已,多个文件,必须建立工程…… [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;
} 无须建工程,
至于MS后面出的编译器,
强制要给你建,
那是没有办法的事情了。
VC6是没有必要的。 不用VC6,主要是Vista下面用VC6很麻烦,还必须自己设置路径…… 是这个道理,其实show.c里面还有大量代码,这里只是简化了。工程也建立了。是不是需要在默认目录下编译呢?
页:
[1]
