如何在C语言中包含存储在单独文件夹中的自定义头文件

16
首先,我是一个初学者,不太确定如何解释我的需求,但我会尝试一下。(我搜索了一下,但没找到完整的答案。)
我正在自学C语言,使用Code Blocks。
我想创建自己的小型函数库,并在我的程序中使用它。
我有一个名为"C"的文件夹。在"C"文件夹中,我有一个名为"Exercises"的文件夹,用于完成书中的小项目。
此外,在"C"中,我想再建一个名为"MyC"的文件夹,用于保存我的头文件和包含我自定义函数实现的.c文件。例如,这些.h和.c将保存在"MyC"中:
//test.h
#ifndef _TEST_H
#define _TEST_H

int mySum(int, int);

#endif // _TEST_H

//测试.c

#include <stdio.h>
#include "test.h"

int mySum(int a, int b)
{
    return a + b;
}

现在,我的目标是在“练习”中创建一个新项目,并且不需要将test.h和test.c的副本复制到项目中,而只需#include我的test.h并执行以下操作:

//testMain.c

#include <stdio.h>
#include <test.h>

int main(void)
{
    printf("\n2 + 1 = %d", mySum(2, 1));

    return 0;
}

我知道<>是用来包含标准头文件的,但引号则是用来包含当前文件夹中的头文件,这正是我不想要的。

有可能实现吗?怎么做?

我尝试了在设置>编译器中进入搜索目录并添加头文件路径,但没有成功。它给我一个错误:“undefined reference to 'mySum'”我还尝试过在#include语句中使用引号和括号。

请问各位能否提供一份逐步说明,告诉我如何实现我的需求?


你正在遇到一个链接器错误,因为链接器无法找到MyC中的一些符号的定义。你是否为MyC目录中的所有文件构建了库?另外,似乎你正在使用某个IDE进行编译。这是真的吗?你愿意直接使用命令行中的gcc吗? - Tuxdude
我不熟悉Code Blocks,但通常你需要设置包含路径并从任何位置添加你的C文件到项目中(除非你想制作一个库 - 但那可能太复杂了)。你需要阅读你的IDE文档,特别关注“包含文件”和“添加外部代码”或类似主题。 - user3458
是的,我记得我读过关于链接 .c 文件的内容,但我不知道如何做。编辑 是的,如果我使用命令行,并编译 "testMain.c",只有当我将所有文件放在同一个文件夹中时才能正常工作,但这不是我想要的。 - Kaiser
所以,我是这样让它工作的:在全局设置中,包含了我的头文件所在的路径,然后在项目的构建选项中,在链接器设置中包含了.o文件的路径.....现在有一个相关的问题...我使用绝对路径是因为我在不同的文件夹中进行项目。我应该改用相对路径吗? - Kaiser
是的,我知道它们的区别,我只是想问哪一个更适合用于链接器设置和搜索目录。我的猜测是绝对路径。 - Kaiser
显示剩余3条评论
4个回答

9

关于头文件

如果你想回到上一级文件夹,可以这样做:#include "../something.h"

在你的情况下,只需这样做:#include "../MyC/test.h"

.. 简单地意味着返回上一级目录

如果你不喜欢这样做,或者你想简单地#include "test.h",你可以使用-I编译器参数来实现,像这样:

-I'../MyC/'

关于c文件

你需要在编译器参数中做类似的事情。

gcc testMain.c ../MyC/test.c

只需记住,.. 意味着返回上一级目录


强烈建议不要在包含“..”的头文件名称中使用相对路径名 - 请参见相对路径(例如“../include/header.h”)用于头文件有什么好处? - Jonathan Leffler

3

编译时需要加入-I选项。例如:

gcc -I<path-to-headers> <path-to>/test.c testMain.c -o test_driver

1
尽管这个答案告诉了如何指定包含路径,但它并没有回答 OP 的错误 undefined reference to something - 这是链接器错误。 - Tuxdude
修复,应该更完整。 - Mosby

3
您已添加头文件夹,这很好。您可以像往常一样使用#include。如果找不到您的头文件,您将收到“文件未找到”的错误。
但是,您还需要链接此目录中的对象代码,并且您需要指定要搜索哪些对象文件以查找您的函数。在您的IDE中应该有一个设置来添加编译器选项,例如../MyC/test.o。如果您尚未编译这些函数中的代码,则需要指定.c文件。

谢谢,这很有帮助。我按照以下方式使其工作:在全局设置中,包含了我的头文件所在的路径,然后在项目设置中,在链接器设置中包含了.o文件的路径。 - Kaiser

0

假设“folder_to_code”包含test.htest.c

您可以使用gcc命令添加一个包含文件夹:

gcc -I folder_to_code folder_to_code/test.c testMain.c -Wall -o program.exe

这样,您就可以在代码中添加#include "test.h"而不会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接