在不同的 .c 文件中使用函数(c 编程 101)

发布于 2024-11-30 02:14:04 字数 426 浏览 2 评论 0原文

/me/home/file1.c containes function definition:

int mine(int i)
{
    /* some stupidity by me */
}

我已经声明了这个函数。

/me/home/file1.h

int mine(int);

如果我想在 /me/home/at/file2.c 中使用这个函数 mine()

为此,我需要做的就是要做的是:

file2.c

#include "../file1.h"

够了吗?可能不会。

做了这么多之后,当我编译 file2.c 时,我得到了对“我的”的未定义引用

/me/home/file1.c containes function definition:

int mine(int i)
{
    /* some stupidity by me */
}

I've declared this function in

/me/home/file1.h

int mine(int);

if I want to use this function mine() in /me/home/at/file2.c

To do so, all I need to do is:

file2.c

#include "../file1.h"

Is that enough? Probably not.

After doing this much, when I compile file2.c, I get undefined reference to 'mine'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

硬不硬你别怂 2024-12-07 02:14:04

您还需要从 file1 链接目标文件。示例:

gcc -c file2.c
gcc -c ../file1.c
gcc -o program file2.o file1.o

或者您也可以同时提供所有文件并让 GCC 完成工作(不建议超出少数文件);

gcc -o program file1.c file2.c

You will also need to link the object file from file1. Example:

gcc -c file2.c
gcc -c ../file1.c
gcc -o program file2.o file1.o

Or you can also feed all files simultaneously and let GCC do the work (not suggested beyond a handful of files);

gcc -o program file1.c file2.c
日久见人心 2024-12-07 02:14:04

不要在标头中使用 ../。相反,指示 gcc 使用父目录作为包含路径:(

在 at 目录中):

gcc -I../ -c file2.c 

Don't use ../ in a header. Instead, instruct gcc to use the parent directory as include path:

(in the at directory):

gcc -I../ -c file2.c 
迎风吟唱 2024-12-07 02:14:04

做了这么多之后,当我编译 file2.c 时,我得到了对“我的”的未定义引用

不,你没有。导致这些错误的不是编译。这是另一件事,称为“链接”。

编译器编译一个“翻译单元” - 在一个源文件上运行预处理器的结果,可能会通过 #include 一次拉入更多内容,然后链接器将它们粘在一起以生成一个可执行的。通常,同一个程序既充当编译器又充当链接器,具有不同的标志,通常您可以告诉它立即执行所有操作(并且不为已编译的翻译单元保存任何临时文件)。但您确实需要告诉它要链接什么,并且您确实需要编译将链接的所有内容。

After doing this much, when I compile file2.c, I get undefined reference to 'mine'

No, you don't. It's not compiling that causes those errors. It's this other thing, called "linking".

The compiler compiles one "translation unit" - the result of running the preprocessor on one source file, possibly pulling in more stuff via #include - at a time, and then the linker sticks these together to make an executable. Typically the same program serves as both the compiler and linker, with different flags, and typically you can tell it to do everything at once (and not save any temporary files for the compiled translation units). But you do need to tell it what to link, and you do need to compile everything that will be linked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文