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