G++ ошибка компиляции: undefined ссылка на общую библиотечную функцию, которая существует
Недавно я установил библиотеку hdf5 на машине ubuntu, и теперь у меня возникли проблемы с привязкой к экспортированным функциям. Я написал простой тест script readHDF.cpp, чтобы объяснить проблему:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}
Команда компиляции
g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \
-L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp
который возвращает следующую ошибку
/tmp/cc6DXdxV.o: In function `main':
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version'
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen'
collect2: ld returned 1 exit status
Я запутался, потому что команда nm, кажется, говорит, что функция была экспортирована:
nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version
который возвращает
0000000000034349 T H5check_version
и аналогичный результат для H5Fopen
. Любые мысли о том, что может пойти не так? Не уверен, что это помогает, но если я прокомментирую часть H5Fopen
script, тогда она компилируется отлично:
#include <hdf5.h>
int main(int argc, char * argv[])
{
hid_t h5_file_id;// = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT);
return 0;
}
Также на сервере установлены несколько версий hdf5, которые используются различными модулями python, такими как h5py и таблицы, но я не мог заставить их работать, поэтому я установил эту версию в свой локальный каталог и изменил опции rpath для компоновщика g++.
Ответы
Ответ 1
Хорошо, решено. Проблема заключалась в размещении -lhdf5 в команде компиляции. По-видимому -lhdf5 следует разместить после чтенияHDF.cpp. Например, g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5
будет компилироваться без проблем, но g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp
завершится с ошибками undefined. Интересно, что это было только проблемой для Ubuntu 12.04, поскольку обе команды компиляции работали для Ubuntu 10.04.
Написал ответ с пояснениями в этом сообщении:
undefined ссылка на символ, даже когда nm указывает, что этот символ присутствует
Я предполагаю, что размещение -lXXX после script является более безопасной практикой.
Ответ 2
Это не ошибка. Видеть
C + + общая библиотека undefined ссылка на` FooClass:: SayHello() '
"Последние версии GCC reuqire, в которые вы помещаете объектные файлы и библиотеки в том порядке, в котором они зависят друг от друга..."
Ответ 3
Вы забыли поместить -lhdf5
в команду компиляции. Кроме того, нет необходимости в -l:$HOME/hdf5/lib/libhdf5.so
Это должно работать: $ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp