C头和源文件混淆

时间:2015-10-13 14:45:31

标签: c gcc reference header include

我自己写了一个我想重用的模块。我的头文件bitstream.h带有结构和函数声明,bitstream.c带有实现。现在我想在我的其他程序中使用它,但不是每次都手动编译bitstream.c,就像你每次使用它时都不必编译stdio.h一样,但我不能让它上班。我的文件看起来像这样:

bitstream.c

#include "bitstream.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

bit_stream_t *fbit_stream(const char *path) {
    FILE *f;

    /* open file for reading */
    f = fopen(path, "rb");

    ...

bitstream.h

#ifndef BITSTREAM_H
#define BITSTREAM_H

#define EOS 0x0a

typedef struct {
    int size;
    int i_byte;
    unsigned char i_bit;
    unsigned char current_bit;
    unsigned char *bytes;
} bit_stream_t;

extern bit_stream_t *fbit_stream(const char *path);
extern unsigned char bit_stream_next(bit_stream_t *bs);
extern void bit_stream_close(bit_stream_t *bs);
extern void print_bit_stream(bit_stream_t *bs);

#endif

我将这两个文件放入/usr/local/include(我在Linux机器上),现在我想在main.c中使用它(在其他地方,例如{{1} }}):

的main.c

/home/foo/main.c

当我尝试#include <bitstream.h> #include <stdio.h> int main(int argc, const char *argv[]) { if (argc != 2) { printf("Need 1 argument!\n"); return 1; } bit_stream_t *my_bs; my_bs = fbit_stream(argv[1]); while (my_bs -> current_bit != EOS) { printf("%d", my_bs -> current_bit); bit_stream_next(my_bs); } bit_stream_close(my_bs); printf("\n"); return 0; } 时,我得到了

gcc -Wall -o main.o main.c

我做错了什么?提前感谢您的帮助!

smuecke

2 个答案:

答案 0 :(得分:3)

编译bitstream.c以创建bitstream.o

gcc -Wall -c bitstream.c

编译main.c和bitstream.o以创建main(如果在winX上则为main.exe)

gcc -Wall -o main main.c bitstream.o

答案 1 :(得分:3)

你不需要&#34;编译&#34; stdio.h每次都是它的实现(以及更多)已经编译并在GLibC生效。也就是说,glibc是一个库(动态库),GCC会在每次编译时将程序链接到它。你可以通过运行来检查:

ldd hello

假设hello是一个简单的 Hello World!程序,例如使用printf。你会得到类似的东西:

linux-vdso.so.1 =>  (0x00007fff5f98d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e985b2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7e98977000)

请参阅第2行:libc.so.6,这是您的GNU C库,这就是您不能编译&#34;每次使用时都会stdio.h

一般案例

您要做的是实现自己的库。所以,为了做到这一点,你可以做几件事。

  1. 您在名为/usr/include的{​​{1}}下创建了一个目录,并将所有标题放在那里。这样您就可以使用MyLib包含文件。
  2. 方法1:您将实现#include <MyLib/myHeader.h>编译为目标文件,并将该对象放在文件夹myImp.c中,并且每次要使用时,你编译:

    /my/libs/path/myImp.o

    注意:prog.c必须gcc -o prog prog.c /my/libs/path/myImp.o

  3. 方法2:您可以使用实用程序#include <MyLibs/myHeader.h>进行存档,并在其中包含所有库。检查它manual here。每当您想要使用库中的某些内容时,请将其与ar库链接。

  4. 方法3:您可以创建一个动态库,这会减小二进制文件的大小(链接.o和.a库是静态链接,这意味着更大的二进制文件大小)。你可以使用ar(位置无关代码)-fPIC标志和其他一些小东西来做到这一点。我会链接一些资源。

  5. 您的具体案例

    1. 使用gcc编译bitstream.c
    2. 将该文件放入gcc -c bitstream.c
    3. /home/you/myLibs/bitstream.o复制到bitstream.h(您需要 root
    4. 包括/usr/include/MyLib/bitstream.h
    5. 使用以下代码编译您的程序:#include <MyLib/bitstream.h>
    6. 虽然这远远不够好,但这会做你想要的。我建议您阅读有关如何组织自己的库等内容的信息,请查看Rusty Russel CCAN Library,这是关于如何构建C库的非常好的起点。

      真的建议退房CCAN!

      资源