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 является более безопасной практикой.

Ответ 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