Basic usage of the htslib api in C
1
0
Entering edit mode
11 months ago
ucbtsm8 ▴ 10

I am thinking about incorporating some parts of htslib into a program I am writing in C in order to read in bcf files to memory. I am aware that there isn't any official documentation of how to use the headers in htslib such as vcf.h. I am not super proficient in C, so I am finding just reading the header files a struggle.

I found somewhere that Heng Li posted this code snippet in order to read the contig size from a bcf file

#include "htslib/vcf.h"

int main(int argc, char *argv[])
{
htsFile *fp;
bcf_hdr_t *hdr;
bcf_idpair_t *ctg;
int i;
if (argc == 1) {
fprintf(stderr, "Usage: print-ctg <in.vcf>\n");
return 1;
}
fp = vcf_open(argv[1], "r");
ctg = hdr->id[BCF_DT_CTG];
for (i = 0; i < hdr->n[BCF_DT_CTG]; ++i)
printf("%s\t%d\n", ctg[i].key, ctg[i].val->info[0]);
bcf_hdr_destroy(hdr);
vcf_close(fp);
return 0;
}


I'd like to play around with this code and try figure out how the whole thing works. However, I am having trouble compiling it (in linux).

I have saved the above code in a file called test_sam.c within the main htslib directory To compile, I think I need to link it against the vcf.c file also in the htslib directory.

If I try

gcc test_sam.c vcf.c -o test


I get

vcf.c:28:10: fatal error: config.h: No such file or directory
28 | #include <config.h>
|          ^~~~~~~~~~
compilation terminated.


I was wondering if someone could point me to how to compile this code in unix. Sorry if it a basic question. Thanks.

htslib C development • 435 views
3
Entering edit mode
11 months ago

Try

gcc test_sam.c  -o test -L/path/to/htslib/dir -I/path/to/htslib/dir -lhts

• -I/path/to/htslib/dir where to find the C include files
• -L/path/to/htslib/dir where to find the C libraries
• -lhts link with htslib

htslib must be compiled before.

Furthermore the best way for compiling C is to write a Makefile.