liblapacke: неопределенная ссылка на символ 'dposv_' - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь скомпилировать эту библиотеку: https://github.com/dthuerck/culip, но я получаю следующую ошибку во время make:

[ 73%] Linking CXX executable culip-tests-la
/usr/bin/cmake -E cmake_link_script CMakeFiles/culip-tests-la.dir/link.txt --verbose=1
/usr/bin/c++    -fPIC -fopenmp -march=native -m64 -DGPU_BLAS -Wfatal-errors -O3   CMakeFiles/culip-tests-la.dir/tests/la/test_sparse.cc.o CMakeFiles/culip-tests-la.dir/tests/la/test_spmv.cc.o CMakeFiles/culip-tests-la.dir/tests/la/test_sqmr.cc.o  -o culip-tests-la  -L/gcc/home/sahmad/Desktop/culip/dependencies/mmio/lib -rdynamic /usr/local/cuda-9.1/lib64/libcudart_static.a -lpthread -ldl -lrt liblibutils.so liblibdatastructures.so liblibla.so liblibalgorithms.so -lmmio liblibtest.so -lblas -lhwloc -lgfortran -lblas -llapacke -lmmio ../dependencies/gtest/lib/libgtest.so ../dependencies/gtest/lib/libgtest_main.so /usr/local/cuda-9.1/lib64/libcudart_static.a -lpthread -ldl -lrt /usr/local/cuda-9.1/lib64/libcublas.so /usr/local/cuda-9.1/lib64/libcusparse.so /usr/local/cuda-9.1/lib64/libcusolver.so /usr/local/cuda-9.1/lib64/libcudadevrt.a -lblas -lhwloc -lgfortran -llapacke ../dependencies/gtest/lib/libgtest.so ../dependencies/gtest/lib/libgtest_main.so /usr/local/cuda-9.1/lib64/libcublas.so /usr/local/cuda-9.1/lib64/libcusparse.so /usr/local/cuda-9.1/lib64/libcusolver.so /usr/local/cuda-9.1/lib64/libcudadevrt.a /usr/local/cuda-9.1/lib64/libcudart_static.a -lpthread -ldl -lrt -Wl,-rpath,/gcc/home/sahmad/Desktop/culip/build:/gcc/home/sahmad/Desktop/culip/dependencies/mmio/lib:/gcc/home/sahmad/Desktop/culip/dependencies/gtest/lib:/usr/local/cuda-9.1/lib64 
/usr/bin/ld: /gcc/home/sahmad/Downloads/lapack-3.8.0/liblapacke.a(lapacke_dposv_work.o): undefined reference to symbol 'dposv_'
//usr/lib/libopenblas.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/culip-tests-la.dir/build.make:171: recipe for target 'culip-tests-la' failed
make[2]: *** [culip-tests-la] Error 1
make[2]: Leaving directory '/gcc/home/sahmad/Desktop/culip/build'
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/culip-tests-la.dir/all' failed
make[1]: *** [CMakeFiles/culip-tests-la.dir/all] Error 2
make[1]: Leaving directory '/gcc/home/sahmad/Desktop/culip/build'
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Я знаю, что это распространенная ошибка, и я пытался следовать другим решениямс похожими ошибками, но так как у меня мало опыта работы с Ubuntu и C ++, я не смог ее решить.Очевидно, это какая-то ошибка компоновки, и я попытался связать библиотеки в другом порядке, но пока не повезло.

Я работаю над Ubuntu 16.04 с gcc 5.4.0 и CUDA 9.1.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 ноября 2018

Lapacke - это интерфейс к lapack : lapacke не встроен в lapacke.В результате оба должны быть связаны. Более того, порядок имеет значение: все функции, используемые в библиотеке слева, должны быть определены библиотеками справа.Как следствие, не могли бы вы попытаться связать -llapacke -llapack -lblas -lm?

Более конкретно, в какой-то момент теста вызывается функция dposv_, и эта функция реализована в Lapack,не в Лапаке.Действительно, в Lapacke есть интерфейс LAPACKE_dposv(), вызывающий LAPACKE_dposv_work(), вызывающий LAPACK_dposv(), то есть LAPACK_GLOBAL(dposv,DPOSV), сводящийся к dposv_ на вашей платформе.

В Cmake, если библиотека lapackв пути поиска в вашей библиотеке, изменение target_link_libraries() в CMakeLists.txt может сделать локальное решение.

target_link_libraries(culip-tests-la lapacke lapack blas m)

Лучше всего добавить следующие команды в CMakeLists.txt , чтобы убедиться, что Blas и Lapack установлены и найдены:

find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)

Последняя строка устанавливает флаги, такие как LAPACK_LIBRARIES и LAPACK_LINKER_FLAGS, как определено в FindLAPACK.html и FindLAPACK.cmake .Затем (как в CMake link atlas и llapack ):

target_compile_options(culip-tests-la ${LAPACK_LINKER_FLAGS})
target_link_libraries(culip-tests-la lapacke ${LAPACK_LIBRARIES})

Строка find_package(BLAS REQUIRED) является излишней, поскольку это почти первое, что сделано в FindLAPACK.cmake .Более того, переменная ${LAPACK_LIBRARIES}, вероятно, содержит что-то вроде -llapack -lblas -lm или более.Может быть напечатано:

message( ${LAPACK_LIBRARIES} )
...