为什么我不能编译我的 C 代码?

Why can't I compile my C code?

我在 /Users/koraytugay

下有这 3 个文件
checksum.h
enc.h
libsec.a

libsec.a 是 checksum.o 和 enc.o

存在的存档文件
Korays-MacBook-Pro:~ koraytugay$ nm libsec.a

libsec.a(enc.o):
0000000000000090 s EH_frame0
0000000000000000 T _enc
00000000000000a8 S _enc.eh
                 U _strlen

libsec.a(checksum.o):
0000000000000078 s EH_frame0
0000000000000000 T _checkSumFor
0000000000000090 S _checkSumFor.eh
Korays-MacBook-Pro:~ koraytugay

这就是我尝试编译 hello.c 文件的方式:

Korays-MacBook-Pro:HelloWorld koraytugay$ gcc hello.c -L/Users/koraytugay -libsec -o koko.out
hello.c:4:10: fatal error: 'enc.h' file not found
#include <enc.h>
         ^
1 error generated.

我做错了什么?

顺便说一句,hello.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <enc.h>
#include <checksum.h>

// code here.. 

您尝试包含 enc.h,但它不在您的包含路径中。您可以将其添加到您的 gcc 调用中以解决此问题:

-I/Users/koraytugay

#include 文件有两种方法:"..."<...>

基本上两者都是实现定义的:

  • <...> 搜索 "a sequence of implementation-defined places",通常称为包含路径。
  • "..."搜索"in an implementation-defined manner",一般是父文件的目录。如果找不到文件,则使用 <...> 方式(包含路径)。

第一种方式应该用于系统头以及不直接包含在项目中的库的头,而第二种方式是直接属于项目的头。

除了缺少 -I. 将当前目录带入包含路径的开关之外,link 规范应该是 -lsec,而不是 -libsec。 linker 在 -l 开关之后获取字符串,在 lib 之前添加并查找它。换句话说,-lfoo 意味着 link 路径上应该有一个 libfoo.a(静态)或 libfoo.so(共享)文件(它本身是用 -L开关)。