首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用samtools C API构建简单的main.cpp文件

如何使用samtools C API构建简单的main.cpp文件
EN

Stack Overflow用户
提问于 2018-10-21 21:34:12
回答 1查看 401关注 0票数 4

我正在尝试(在Linux上,使用G++)使用samtools C API (https://github.com/samtools/samtools)编译一个简单的main.cpp程序,该程序已经下载到我的main.cpp文件的文件夹中。我希望有一个非常简单的makefile编译main.cpp (并最终编译samtools代码)。然而,由于我对makefile知之甚少,我可能做错了什么。

这是我的makefile:

代码语言:javascript
复制
SAMTOOLS=./samtools/
HTSLIB=${SAMTOOLS}htslib-1.9/

all: samtools htslib BAMCoverage

samtools: 
    ${MAKE} -C ${SAMTOOLS}

htslib: 
    ${MAKE} -C ${HTSLIB}

BAMCoverage: main.cpp
    g++ -I./ -I${SAMTOOLS} -I${HTSLIB} -g -O2 -Wall ./main.cpp -o ./BAMCoverage -lz -L${SAMTOOLS} -L${HTSLIB} -lbam  -lhts

下面是我的cpp main:

代码语言:javascript
复制
#include "samtools/sam.h"

#include <string>
#include <iostream>

using namespace std;

int main (int argc, char *argv[]) { 
    string bam_file_path ("myfile.bam");
    bamFile bam_file = bam_open (bam_file_path.c_str (), "rb");
    if (bam_file == 0) {
        cerr << "Failed to open BAM file " << bam_file_path << endl;
        return 1;
    }
    bam_close (bam_file);

    return 0;
}

当我运行"make“时,它编译时没有任何警告,但在运行时,它告诉我:”加载共享库时出错: libhts.so.2无法打开共享目标文件“

任何帮助都非常受欢迎!提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-22 01:44:09

这不是makefile本身的问题;您的makefile有一些问题,但您遇到的问题是理解如何正确地链接共享库。换句话说,如果您从shell命令行运行相同的命令集,而不是使用makefile,您将会遇到相同的问题。

您应该查找有关链接命令行选项-L的文档,并阅读链接时和运行时库位置之间的差异。

-lfoo选项将告诉链接器链接到名为foo的库中。-Lsome/dir选项将告诉链接器在目录some_dir中查找库foo

如果链接器找到一个静态库libfoo.a,那么该库中用于链接程序的任何部分都将直接包含到程序中。这会使您的程序变得更大,但这意味着在运行时,除了您的程序之外,没有什么需要找到的。

如果链接器找到一个共享库(也称为动态库) libfoo.so,那么链接器只是将一个库名为libfoo.so的引用放到您的程序中(当然,细节要比这个复杂得多,但这是一般的想法)。这会使你的程序变得更小,但这意味着在运行时不仅需要你的程序,还需要共享库,否则你的程序就不能运行。

这称为运行时链接,用于在启动程序时解析所有这些共享引用的程序称为运行时链接器。出于非常好的原因,编译时链接器放入程序中的引用只列出了库的名称,而不是库的完整路径。这意味着运行时链接器需要知道在哪里查找共享库。

运行时链接器查看各种地方,可以通过阅读其文档来了解;例如,在GNU/Linux上,运行时链接器称为ld.so,因此您可以使用man ld.so阅读文档。

这是一个复杂的主题,最好的方法很大程度上取决于您的需求和要求。

如果只想硬编码编译/链接时要查看的路径,可以在链接行中添加一个-Rsome/dir选项,每个-L选项对应一个选项,如下所示:

代码语言:javascript
复制
BAMCoverage: main.cpp
        g++ -I./ -I${SAMTOOLS} -I${HTSLIB} -g -O2 -Wall ./main.cpp -o ./BAMCoverage -lz -L${SAMTOOLS} -L${HTSLIB} -R${SAMTOOLS} -R${HTSLIB} -lbam  -lhts

只要SAMTOOLSHTSLIB目录存在并且其中仍然包含正确的共享库,就可以很好地工作。显然,这是一个很大的限制,但我们无法猜测您的最终需求是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52915853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档