用gcc编译所有必需的文件

时间:2019-05-08 14:32:02

标签: c compiler-errors

我对C和gcc编译器很陌生。我有一个项目,其中包含其他一些.h文件。在那些文件中,包含了更多自己的.h文件。等等。它包括相当数量。 我的问题是,当我尝试使用以下命令编译主文件时:

gcc -o test tests_main.c

我收到以下错误:

Undefined symbols for architecture x86_64:
 "_waves_secure_hash_test", referenced from:
     _crypto_tests in tests_main-d1ae56.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

那是因为编译器无法找到方法“ waves_secure_hash_test”,但是它在包含的文件中:

#include "crypto_tests.h" 

因此,我进行了一些搜索,找到了一个解决方案,只需将其编译为:

gcc -o test tests_main.c crypto_tets.c

好吧,这对我来说适用于这两个测试文件,其中的功能只是一些测试打印件。 对于我的包含大量项目的完整项目,我无法写下所有要编译的c文件...有没有办法告诉编译器他必须编译所有需要的文件和包含的文件?

1 个答案:

答案 0 :(得分:5)

您正在混合包含的文件(.h文件,头文件)和源文件(.c文件)。您无需对头文件做任何事情,编译器将自动处理它们(1)

要做必须列出要编译的所有源文件。它们是定义您的项目的源文件。不过,根据您的源代码树组织,您可能无法使用外壳模式扩展(例如*.c)来获取它们。

对于大型项目,通常不需要手动输入编译命令,而是使用一些项目管理工具,例如IDE,Makefile或CMake等构建系统生成器。

还请注意,您实际上遇到的错误不是 compiler 错误,而是 linker 错误。链接是编译之后的一个单独步骤。该编译将读取源文件并生成目标文件。链接然后读取目标文件,并从中生成二进制文件(可执行或共享库)。

您还应该注意,头文件和源文件之间并不总是存在1:1的对应关系。经典示例是库:您可以包括一个或多个外部库附带的头文件;这些将为该库内实现的函数提供声明。这使您可以调用代码中的函数。然后,要使链接器可以使用这些功能(以便它们可以成为程序的一部分),请指示链接器将库链接到二进制文件中(通常通过-l命令行选项)。


(1)您可能仍需要将编译器指向这些头文件所在的目录,这通常是使用-I命令行选项完成的。