- Используйте
VERBOSE=1 make
для просмотра вывода компоновщика. Искать -lhtslib
- Прочитайте документацию для конкретного
Find<LIB>.cmake
.
Ваши конкретные вопросы:
- «Как мне найти то, что нашел CMake»: используйте
cmake-gui
или ccmake
. Они оба показывают одну и ту же информацию, но один из них представляет собой графический интерфейс, а другой - интерфейс Curses. В расширенном режиме («t» на ccmake
) вы найдете все переменные для найденных пакетов. Кроме того, вы можете использовать MESSAGE(STATUS "Found htslib at: ${htslib_LIBRARIES}")
.
- "Как явно написать в CMakeLists.txt, где находится библиотека?" Пожалуйста, не делайте этого! CMake предназначен для абстрагирования именно такой информации. У вас есть два варианта, во-первых, хороший: настроить cmake в командной строке (или в графических интерфейсах, упомянутых выше), чтобы получить
CMAKE_MODULES_PATH
или более конкретную подсказку для библиотеки -D htslib_PATH=/usr/local/.../
(указывающую на каталог, где libhts.dylib
проживает). Худшее решение было бы предоставить подсказку для find_package
. find_package(htslib REQUIRED PATH /usr/local/lib)
или find_package(htslib REQUIRED HINT /usr/local/lib /some/second/path/where/it/may/be)
.
Решение
Ваш связанный проект имеет пользовательскую FindHTSlib.cmake
ссылку . Этот использует pkg_config
для настройки библиотеки. Чтобы повторить вашу проблему, я использовал brew для установки htslib
. Файл pkg-config можно найти (для меня, но brew info htslib
говорит вам) в /usr/local/Cellar/htslib/1.8/lib/htslib.pc
. Итак, давайте дадим CMake необходимую подсказку.
Я не смог проверить это, потому что для меня он нашел пакет htslib напрямую, без дальнейших подсказок.
git clone https://github.com/D-Lo/bamdb # I am using version f5f03d0
mkdir -p bamdb/build; cd bamdb/build
brew install ck htslib lmdb
cmake .. # -G Ninja recommended, but needs brew install ninja
make # lot's of missing symbols
Я бы порекомендовал изменить в CMakeLists.txt
минимально требуемую версию CMake с 2,8 до 3.10
(или хотя бы 3,6).
Это ошибка, которую я получаю:
[ 62%] Linking C shared library libbamdb.dylib
/usr/local/Cellar/cmake/3.11.1/bin/cmake -E cmake_link_script CMakeFiles/libbamdb.dir/link.txt --verbose=1
/Library/Developer/CommandLineTools/usr/bin/cc -Wall -g -std=gnu99 -fPIC -dynamiclib -Wl,-headerpad_max_install_names -o libbamdb.dylib -install_name @rpath/libbamdb.dylib CMakeFiles/libbamdb.dir/src/bam_api.c.o CMakeFiles/libbamdb.dir/src/bam_lmdb.c.o CMakeFiles/libbamdb.dir/src/bamdb.c.o
Undefined symbols for architecture x86_64:
"_bam_destroy1", referenced from:
_get_bam_row in bam_api.c.o
_deserialize_func in bam_lmdb.c.o
Это можно исправить, добавив следующую строку в CMakeLists.txt
после строки add_library(libbamdb ${SOURCES})
:
target_link_libraries(libbamdb ${LIBS})
Некоторые дополнительные замечания: теперь у вас есть библиотека с функцией main
. Это потому, что ${SOURCES}
используется для сборки исполняемого файла и библиотеки. Это может иметь неожиданные побочные эффекты. Если это не нужно, не делайте этого.