Как создать простой файл main.cpp с помощью samtools C API - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь скомпилировать (в Linux, используя G ++) простую программу main.cpp, используя samtools C API (https://github.com/samtools/samtools), которую я скачал в папку моего файла main.cpp. Я хотел быу меня есть очень простой make-файл, компилирующий main.cpp (и в конечном итоге компилирующий код samtools). Однако, поскольку у меня очень мало знаний о make-файлах, я, вероятно, что-то делаю не так.

Вот мой make-файл:

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:

#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 не может открыть общий объектный файл "

Любая помощь приветствуется! Заранее спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

Это не проблема с вашим make-файлом как таковым;у вашего make-файла есть некоторые проблемы, но проблема, с которой вы сталкиваетесь, заключается в понимании того, как правильно связываться с общими библиотеками.Другими словами, если вы запустите тот же набор команд из командной строки оболочки, вместо использования make-файла, у вас возникнет та же проблема.

Вам следует искать документацию по параметру командной строки вашей ссылки -L и прочитайте о разнице между время соединения и время выполнения местоположения библиотеки.

Опция -lfoo скажет компоновщику связать в библиотекепо имени foo.Опция -Lsome/dir скажет компоновщику найти эту библиотеку foo в каталоге some_dir.

Если компоновщик найдет статическую библиотеку libfoo.a, тогда любые части этой библиотеки необходимы для связывания вашей библиотеки.Программа будет включена непосредственно в вашу программу.Это делает вашу программу больше, но это означает, что в время выполнения ничего кроме вашей программы не нужно искать.

Если компоновщик находит общую библиотеку (также называемую динамической библиотекой) libfoo.so тогда компоновщик просто помещает ссылку на имя библиотеки libfoo.so в вашу программу (конечно, детали более сложные, чем эта, но это общая идея).Это делает вашу программу меньше , но , это означает, что во время выполнения нужна не только ваша программа, но и общая библиотека, иначе ваша программа не может работать.

Это называется связывание во время выполнения и программа, используемая для разрешения всех этих общих ссылок при запуске вашей программы, называется компоновщик во время выполнения .По очень веским причинам ссылка, которую компоновщик во время компиляции вставляет в вашу программу, просто перечисляет имя библиотеки, а не полный путь к библиотеке.Это означает, что компоновщик во время выполнения должен знать, где искать общую библиотеку.

Компоновщик во время выполнения просматривает различные места, о которых можно узнать, прочитав его документацию;например, в GNU / Linux компоновщик времени выполнения называется ld.so, поэтому вы можете читать документы с помощью man ld.so.

Это сложный вопрос, и лучший способ сделать это зависит от LOTваши потребности и требования:

Если вы просто хотите жестко запрограммировать путь для просмотра во время компиляции / компоновки, вы можете добавить опцию -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 существуют и все еще содержат правильные общие библиотеки в них.Очевидно, это большое ограничение, но мы не можем догадаться, каковы ваши конечные требования.

...