【问题标题】:Why can't I compile my C code?为什么我不能编译我的 C 代码?
【发布时间】:2015-06-12 11:16:28
【问题描述】:

我在 /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.

我做错了什么?

顺便说一句,你好.c:

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

// code here.. 

【问题讨论】:

  • 认为是因为编译器找不到名为enc.h的文件...
  • Err... 没有为 enc.h 提供有效路径?
  • 了解 include 和 include "" 之间的区别。 enc.h 和 checksum.h 应该包含 ""。
  • @cup 我认为标题与hello.c 不在同一个文件夹中。
  • @SeanBright 好主意。太棒了。

标签: c linker include include-path


【解决方案1】:

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

-I/Users/koraytugay

【讨论】:

  • @KorayTugay -L 用于链接,-I 用于包含。
  • @KorayTugay -L 仅指定 gcc 应在其中查找库的目录(.so 文件)。 -I 指定 gcc 应该在其中查找头文件的目录。
  • @SouravGhosh 谢谢,我试过 gcc hello.c -I/Users/koraytugay -L/Users/koraytugay -libsec -o koko.out 但现在我得到:ld: library not found for - libsec 我确定 libsec.a 在那里。
  • @KorayTugay 你尝试添加-static吗?
  • @SouravGhosh 我得到 gcc -static hello.c -I/Users/koraytugay -L/Users/koraytugay -libsec -o koko.out ld:找不到 -lcrt0.o 的库 clang:错误:链接器命令失败,退出代码为 1
【解决方案2】:

#include 文件有两种方法:"..."&lt;...&gt;

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

  • &lt;...&gt; 搜索“一系列实现定义的位置”,通常称为包含路径。
  • "..." 搜索“以实现定义的方式”,通常是父文件的目录。如果未找到该文件,则改用 &lt;...&gt; 方式(包含路径)。

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

【讨论】:

  • #include &lt;...&gt; 在“一系列实现定义的位置”中搜索指定的标头。 #include "..."“以实现定义的方式”搜索命名的源文件;如果失败,则继续处理#include &lt;...&gt;。一般来说,你应该使用"..."作为你项目的一部分的头文件,&lt;...&gt;作为系统头文件。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多