user-0 提问: C新手，文件包含问题,莫名错误

回复:
user: user-1
content: 除非你把工程给我看看，否则我也不知道你是什么原因

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:搜“跟我一起写makefile”  谢谢，很好的文档，不过现在我还是window环境，暂时没有深入到那边去    引用 11 楼 angel_su 的回复:看一下build log里面的命令行确定所需文件是否都进行编译。一般是有文件没加入工程，或者加入工程却不属于当前编译目标... 引用 10 楼 neustar1 的回复:[quote=引用 8 楼 benma378 的回复:]  关键是这个目标文件是IDE自动生成的，我的源文件和主源文件是在同一个目录下的， 上一个工程就是这么弄的，我就不知道咋个回事  这个问题不太好解释，我再弄弄  谢谢回答 我理解你的意思，说白了就是IDE添加的文件呗。 正常情况下的确不应该出现这个问题，可是偏偏出现了，那就说明偶然间出错了呀，或者在关闭电脑的时候工程配置没有保存好，导致等等。[/quote]  解决了，我也是误打误撞  因为如果把所有函数放在一个文件里，编译通过  我的引用文件是 search.h  后来我改成 s.h 函数实现文件也改成 s.c 结果通过 我查了一下文档，没有看到 search.h这样的头文件 我不知道为啥这个名字不行，这个有点迷糊

user: user-2
content: 看一下build log里面的命令行确定所需文件是否都进行编译。一般是有文件没加入工程，或者加入工程却不属于当前编译目标...

user: user-1
content: 引用 8 楼 benma378 的回复:关键是这个目标文件是IDE自动生成的，我的源文件和主源文件是在同一个目录下的， 上一个工程就是这么弄的，我就不知道咋个回事  这个问题不太好解释，我再弄弄  谢谢回答 我理解你的意思，说白了就是IDE添加的文件呗。 正常情况下的确不应该出现这个问题，可是偏偏出现了，那就说明偶然间出错了呀，或者在关闭电脑的时候工程配置没有保存好，导致等等。

user: user-3
content: 搜“跟我一起写makefile”

user: user-0
content: 引用 7 楼 neustar1 的回复:[quote=引用 6 楼 benma378 的回复:] [quote=引用 5 楼 neustar1 的回复:] [quote=引用 4 楼 benma378 的回复:] [quote=引用 2 楼 user-4 的回复:] 你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。 引用 3 楼 neustar1 的回复:[quote=引用 楼主 benma378 的回复:] 开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。[/quote]  两个工程都实现了 我直接把实现的代码copy到主文件就不会报错[/quote] 那应该是你工程设置出了问题，insertsort.o没有生成，你看看[/quote]  确实没有生成，编译都没有通过的嘛 那是什么问题导致没有生成呢？ 我没有改过任何配置啊[/quote] 编译有两个过程，一个是生成目标文件，另外一个是链接。 按照你的源文件，应该有两个目标文件insertsort.o和main.o，这个是每个.c文件单独编译生成的； 你报的错是第二个过程，也就是链接时候报错。 之所以链接出错是因为第一步中的insertsort.o没有生成，所以原因只有一个，你没有把insertsort.o加入到工程中。[/quote]  关键是这个目标文件是IDE自动生成的，我的源文件和主源文件是在同一个目录下的， 上一个工程就是这么弄的，我就不知道咋个回事  这个问题不太好解释，我再弄弄  谢谢回答

user: user-1
content: 引用 6 楼 benma378 的回复:[quote=引用 5 楼 neustar1 的回复:] [quote=引用 4 楼 benma378 的回复:] [quote=引用 2 楼 user-4 的回复:] 你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。 引用 3 楼 neustar1 的回复:[quote=引用 楼主 benma378 的回复:] 开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。[/quote]  两个工程都实现了 我直接把实现的代码copy到主文件就不会报错[/quote] 那应该是你工程设置出了问题，insertsort.o没有生成，你看看[/quote]  确实没有生成，编译都没有通过的嘛 那是什么问题导致没有生成呢？ 我没有改过任何配置啊[/quote] 编译有两个过程，一个是生成目标文件，另外一个是链接。 按照你的源文件，应该有两个目标文件insertsort.o和main.o，这个是每个.c文件单独编译生成的； 你报的错是第二个过程，也就是链接时候报错。 之所以链接出错是因为第一步中的insertsort.o没有生成，所以原因只有一个，你没有把insertsort.o加入到工程中。

user: user-0
content: 引用 5 楼 neustar1 的回复:[quote=引用 4 楼 benma378 的回复:] [quote=引用 2 楼 user-4 的回复:] 你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。 引用 3 楼 neustar1 的回复:[quote=引用 楼主 benma378 的回复:] 开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。[/quote]  两个工程都实现了 我直接把实现的代码copy到主文件就不会报错[/quote] 那应该是你工程设置出了问题，insertsort.o没有生成，你看看[/quote]  确实没有生成，编译都没有通过的嘛 那是什么问题导致没有生成呢？ 我没有改过任何配置啊

user: user-1
content: 引用 4 楼 benma378 的回复:[quote=引用 2 楼 user-4 的回复:] 你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。 引用 3 楼 neustar1 的回复:[quote=引用 楼主 benma378 的回复:] 开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。[/quote]  两个工程都实现了 我直接把实现的代码copy到主文件就不会报错[/quote] 那应该是你工程设置出了问题，insertsort.o没有生成，你看看

user: user-0
content: 引用 2 楼 user-4 的回复:你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。 引用 3 楼 neustar1 的回复:[quote=引用 楼主 benma378 的回复:] 开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。[/quote]  两个工程都实现了 我直接把实现的代码copy到主文件就不会报错

user: user-1
content: 引用 楼主 benma378 的回复:开发环境 CodeBlocks 编译环境 GCC  我在CodeBlocks建了两个工程练手 第一个是一个插入排序 工程目录结构  InsertSort---|       ------Sources             -------insertsort.c             -------main.c       ------Headers               ----insertsort.h   所有语法正确，文件包含也正确，编译运行没有问题  第二个工程是查找问题 工程目录结构一样 在main.c文件里也包含了头文件 所有工程没有使用特殊库等，语法问题排除  问题： 第二个工程编译不通过 ||=== Build: Debug in SeartNumber (compiler: GNU GCC Compiler) ===| obj\Debug\main.o||In function `main':| I:\codeblocksworkspace\SeartNumber\main.c|11|undefined reference to `show_welcome'| I:\codeblocksworkspace\SeartNumber\main.c|19|undefined reference to `lineSearch'| I:\codeblocksworkspace\SeartNumber\main.c|22|undefined reference to `binarySearch'| I:\codeblocksworkspace\SeartNumber\main.c|29|undefined reference to `show_welcome'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|   从错误来看，似乎是文件包含不成功 但是第一个工程却是成功的，没有什么特别的路径问题 当我把它们写在main.c文件的时候就不报错了，更加证明了是文件包含的问题 我就搞不懂了，同样的写法和工程目录结构，只是功能不一样而已，为啥第一个可以通过，第二个通不过 google之，大多人都说是lib顺序问题，但我都没用什么特殊的lib，怎么会出现这个问题 即便我把自己写的头文件(使用的双引号引入的)写在第一行也如此 不解，求解答 有函数只声明没实现。

user: user-4
content: 你这儿头文件没问题，因为编译都通过了，只是链接时出问题了。估计是你有一个cpp文件没加入到工程中。

user: user-0
content: 顺带问一下大家， 我工程的名字写错了，想修改回来，在codeblocks如何修改回来？  我找了半天菜单和快捷键都没有找到，可以修改文件名，但貌似工程名没有，难道我又眼拙了？