我自己写了一个我想重用的模块。我的头文件bitstream.h
带有结构和函数声明,bitstream.c
带有实现。现在我想在我的其他程序中使用它,但不是每次都手动编译bitstream.c
,就像你每次使用它时都不必编译stdio.h
一样,但我不能让它上班。我的文件看起来像这样:
#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");
...
#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} }}):
/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
答案 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
。
您要做的是实现自己的库。所以,为了做到这一点,你可以做几件事。
/usr/include
的{{1}}下创建了一个目录,并将所有标题放在那里。这样您就可以使用MyLib
包含文件。 方法1:您将实现#include <MyLib/myHeader.h>
编译为目标文件,并将该对象放在文件夹myImp.c
中,并且每次要使用时,你编译:
/my/libs/path/myImp.o
注意:prog.c必须gcc -o prog prog.c /my/libs/path/myImp.o
。
方法2:您可以使用实用程序#include <MyLibs/myHeader.h>
进行存档,并在其中包含所有库。检查它manual here。每当您想要使用库中的某些内容时,请将其与ar
库链接。
方法3:您可以创建一个动态库,这会减小二进制文件的大小(链接.o和.a
库是静态链接,这意味着更大的二进制文件大小)。你可以使用ar
(位置无关代码)-fPIC
标志和其他一些小东西来做到这一点。我会链接一些资源。
gcc
编译bitstream.c
。gcc -c bitstream.c
。/home/you/myLibs/bitstream.o
复制到bitstream.h
(您需要 root )/usr/include/MyLib/bitstream.h
#include <MyLib/bitstream.h>
。虽然这远远不够好,但这会做你想要的。我建议您阅读有关如何组织自己的库等内容的信息,请查看Rusty Russel CCAN Library,这是关于如何构建C库的非常好的起点。
我真的建议退房CCAN!