如何使用SamToolsCAPI构建简单的main.cpp文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (67)

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

Here is my makefile:

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

And here is my cpp main:

#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;
}

It compiles with no warning when I run "make", but at runtime, it tells me: "error while loading shared libraries: libhts.so.2 cannot open shared object file"

Any help is more than welcome! Thanks in advance.

提问于
用户回答回答于

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

您应该在链接命令行选项中查找文档,-L并阅读链接时运行时库位置之间的区别。

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

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

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

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

运行时链接器可以在不同的地方查找,可以通过阅读其文档来了解它们; 例如,在GNU / Linux上调用运行时链接程序,ld.so以便您可以阅读文档man ld.so

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

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

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目录存在并且仍然包含正确的共享库,这将正常工作。显然这是一个很大的限制,但我们无法猜测你的最终要求是什么。

扫码关注云+社区

领取腾讯云代金券