2013-01-18 42 views
1

我想运行位于桌面的C代码,头文件位于其他位置。什么应该是适合编译和执行的gcc命令?我附上了下面的代码。我在询问这方面的问题并提供帮助。如何在Linux中使用gcc命令编译C代码时包含lib

#include <config.h> 
#endif 

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 

#include </usr/include/pulse/simple.h> 
#include </usr/include/pulse/error.h> 

#define BUFSIZE 32 

int main(int argc, char*argv[]) { 

    /* The Sample format to use */ 
static const pa_sample_spec ss = { 
    .format = PA_SAMPLE_S16LE, 
    .rate = 44100, 
    .channels = 2 
}; 

pa_simple *s_in, *s_out = NULL; 
int ret = 1; 
int error; 


/* Create a new playback stream */ 
if (!(s_out = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &error))) { 
    fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error)); 
    goto finish; 
} 

    if (!(s_in = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) { 
    fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error)); 
    goto finish; 
} 

for (;;) { 
    uint8_t buf[BUFSIZE]; 
    ssize_t r; 

    #if 1 
    pa_usec_t latency; 

    if ((latency = pa_simple_get_latency(s_in, &error)) == (pa_usec_t) -1) { 
     fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error)); 
     goto finish; 
    } 

    fprintf(stderr, "In: %0.0f usec \r\n", (float)latency); 

     if ((latency = pa_simple_get_latency(s_out, &error)) == (pa_usec_t) -1) { 
     fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error)); 
      goto finish; 
     } 

     fprintf(stderr, "Out: %0.0f usec \r\n", (float)latency); 
#endif 

     if (pa_simple_read(s_in, buf, sizeof(buf), &error) < 0) { 

     fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno)); 
     goto finish; 
    } 

    /* ... and play it */ 
    if (pa_simple_write(s_out, buf, sizeof(buf), &error) < 0) { 
     fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error)); 
     goto finish; 
    } 
} 

/* Make sure that every single sample was played */ 
if (pa_simple_drain(s_out, &error) < 0) { 
    fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error)); 
    goto finish; 
} 

ret = 0; 

finish: 

if (s_in) 
    pa_simple_free(s_in); 
if (s_out) 
    pa_simple_free(s_out); 

return ret; 
} 
+0

您可以使用'-I'选项将目录添加到包含路径。 –

+0

你能写出完整的命令吗? –

+1

这只是'gcc -I“/ path/to/folder/that/contains/the/headers”program.c“ –

回答

1

C编译器包括头文件(通过#include)或者通过:

  1. #include "somename.h":它开始在目录seaching其中源是somefile.h,如果找不到它有它开始看起来像(2)
  2. #include <somename.h>:它搜索的(依赖于系统)目录的序列。在类Unix系统(Linux,MacOS)中,这基本上是/usr/include,但可能会添加其他目录。

您可以在大多数编译器中通过-I/some/path flags来控制它,它在序列(2)的开始处添加/some/path。还需要注意的是上面的somename.h可以包括/,因此,如果你写

#include "this/file.h" 

然后查找file.hthis目录在当前目录。

0

尝试gcc -c -I/path/to/source/files fileName.c。看到http://www.network-theory.co.uk/docs/gccintro/gccintro_22.html

+0

我如何执行?看我的代码有两个头文件。我应该在路径中定义两个头文件吗?如果您根据代码中给出的路径编辑命令,这将会很有帮助。谢谢 –

+0

你只需要包含包含标题的目录。编译器会自动为你挑选 –

+0

我没有得到你的Shantanu。我是这个平台的新手。请给我举例。 –

1

看起来像你只需要更换此:

#include </usr/include/pulse/simple.h> 
#include </usr/include/pulse/error.h> 

与此:

#include "simple.h" 
#include "error.h" 

和您的命令行必须是这样的这个:

gcc -I"/usr/include/pulse" program.c -lpulse 

您需要用源文件的名称替换'program.c'。

甚至只需更换这两个线连下两:

#include <pulse/simple.h> 
#include <pulse/error.h> 

(目录/ usr/include目录似乎是标准包括路径) 在这种情况下您的命令行会刚:

gcc program.c -lpulse 
+0

显示“未定义的引用........”。该位置是否在双引号(“”)下? –

+0

@Naseef Ur Rahman“Undefined reference to ...”是链接器错误。这意味着编译器找到头文件,但链接程序找不到相应的目标文件(或库)。尝试添加像-lpulse这样的命令行 – cody

+0

你能写吗? –

相关问题