如何使用 samtools C API 构建一个简单的 main.cpp 文件
How to build a simple main.cpp file using samtools C API
我正在尝试编译(在 Linux,使用 G++)一个简单的 main.cpp 程序,使用我在我的 main.cpp 文件的文件夹。
我想要一个非常简单的 makefile 来编译 main.cpp(并最终编译 samtools 代码)。但是,由于我对makefile的了解很少,所以我可能做错了。
这是我的 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
这是我的主 cpp:
#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" 时没有警告编译,但在 运行 时,它告诉我: "error while loading shared libraries: libhts.so.2 cannot open shared object file"
非常欢迎任何帮助!提前致谢。
这不是您的 makefile 本身的问题;您的 makefile 有一些问题,但您 运行 遇到的问题是了解如何正确 link 共享库。换句话说,如果您 运行 来自 shell 命令行的同一组命令,而不是使用 makefile,您会遇到同样的问题。
您应该查找有关 link 命令行选项 -L
的文档,并阅读 link-time 和 运行-time 图书馆位置。
-lfoo
选项将告诉 linker 在名为 foo
的库中 link。 -Lsome/dir
选项将告诉 link 用户在目录 some_dir
.
中找到该库 foo
如果 linker 找到一个静态库 libfoo.a
那么 link 您的程序需要该库的任何部分都将直接包含到您的程序中。这会使您的程序更大,但这意味着在 运行-time 除了您的程序之外什么都不需要找到。
如果 linker 找到一个共享库(也称为动态库)libfoo.so
,那么 linker 只是引用库名称 libfoo.so 到你的程序中(当然细节比这更复杂,但这是一般的想法)。这使你的程序更小但是这意味着在运行时候不仅需要你的程序而且还需要共享库,否则你的程序不能运行.
这称为 运行-time linking 并且在您启动程序时用于解析所有这些共享引用的程序称为 运行-时间linker。出于非常充分的理由,编译时 linker 在您的程序中放入的引用仅列出库的 名称 ,而不是库的完整路径。这意味着 运行-time linker 需要知道在哪里可以找到共享库。
运行-time linker 在各个地方查看,可以通过阅读其文档了解;例如,在 GNU/Linux 上 运行-time linker 被称为 ld.so
,因此您可以使用 man ld.so
.
阅读文档
这是一个复杂的主题,最好的方法在很大程度上取决于您的需要和要求。
如果您只想硬编码在 compile/link 时间查看的路径,您可以在 link 行中添加一个 -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
只要 SAMTOOLS
和 HTSLIB
目录存在并且仍然包含正确的共享库,这就可以正常工作。显然这是一个很大的限制,但我们无法猜测您的最终要求是什么。
我正在尝试编译(在 Linux,使用 G++)一个简单的 main.cpp 程序,使用我在我的 main.cpp 文件的文件夹。 我想要一个非常简单的 makefile 来编译 main.cpp(并最终编译 samtools 代码)。但是,由于我对makefile的了解很少,所以我可能做错了。
这是我的 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
这是我的主 cpp:
#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" 时没有警告编译,但在 运行 时,它告诉我: "error while loading shared libraries: libhts.so.2 cannot open shared object file"
非常欢迎任何帮助!提前致谢。
这不是您的 makefile 本身的问题;您的 makefile 有一些问题,但您 运行 遇到的问题是了解如何正确 link 共享库。换句话说,如果您 运行 来自 shell 命令行的同一组命令,而不是使用 makefile,您会遇到同样的问题。
您应该查找有关 link 命令行选项 -L
的文档,并阅读 link-time 和 运行-time 图书馆位置。
-lfoo
选项将告诉 linker 在名为 foo
的库中 link。 -Lsome/dir
选项将告诉 link 用户在目录 some_dir
.
foo
如果 linker 找到一个静态库 libfoo.a
那么 link 您的程序需要该库的任何部分都将直接包含到您的程序中。这会使您的程序更大,但这意味着在 运行-time 除了您的程序之外什么都不需要找到。
如果 linker 找到一个共享库(也称为动态库)libfoo.so
,那么 linker 只是引用库名称 libfoo.so 到你的程序中(当然细节比这更复杂,但这是一般的想法)。这使你的程序更小但是这意味着在运行时候不仅需要你的程序而且还需要共享库,否则你的程序不能运行.
这称为 运行-time linking 并且在您启动程序时用于解析所有这些共享引用的程序称为 运行-时间linker。出于非常充分的理由,编译时 linker 在您的程序中放入的引用仅列出库的 名称 ,而不是库的完整路径。这意味着 运行-time linker 需要知道在哪里可以找到共享库。
运行-time linker 在各个地方查看,可以通过阅读其文档了解;例如,在 GNU/Linux 上 运行-time linker 被称为 ld.so
,因此您可以使用 man ld.so
.
这是一个复杂的主题,最好的方法在很大程度上取决于您的需要和要求。
如果您只想硬编码在 compile/link 时间查看的路径,您可以在 link 行中添加一个 -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
只要 SAMTOOLS
和 HTSLIB
目录存在并且仍然包含正确的共享库,这就可以正常工作。显然这是一个很大的限制,但我们无法猜测您的最终要求是什么。