2015-04-07 82 views
0

我下/用户这3个文件/ koraytugay为什么我不能编译我的C代码?

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.. 
+0

我_think_这是因为编译器无法找到名为'enc.h'的文件... –

+0

Err ...没有提供有效的enc.h路径? –

+2

了解include <>和include“”之间的区别。 enc.h和checksum.h应该包含“”。 – cup

回答

1

除了缺少-I.切换到使当前目录进入包含路径,链接规范应为-lsec而不是-libsec。链接器采用-l开关之后的字符串,并预先lib,然后查找该字符串。换句话说,-lfoo意味着链接路径上应该有一个libfoo.a(静态)或libfoo.so(共享)文件(该文件本身是通过-L开关指定的)。

2

您尝试包括enc.h,但它不是在你的包含路径。您可以添加到您的gcc调用来解决这个问题:

-I/Users/koraytugay 
+0

但我已经有:-L /用户/ koraytugay? –

+1

@KorayTugay'-L'用于链接,''I'用于包含。 –

+0

@KorayTugay'-L'只指定gcc应该在哪些目录中查找库('.so'文件)。'-I'指定gcc应该查找头文件的目录。 – thejh

0

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

本质上都是实现定义:

  • <...>搜索,也就是通常所说的包含路径“的实现所定义的地方序列”。
  • "..."以“实现定义的方式”搜索,这通常是父文件的目录。如果找不到该文件,则使用<...>方式(包含路径)代替。

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

+2

'#include <...>'为指定的头部搜索“一系列实现定义的位置”。 '#include“...”'以实现定义的方式搜索指定的源文件“;如果失败了,那么就进行#include <...>'。一般来说,你应该使用'“...”作为你项目的头文件,'<...>'用于系统头文件。 –

+0

@凯特汤普森谢谢。根据您的评论,我精简了我的答案... – glglgl

相关问题