связывание библиотек c ++ в Linux

0

Я выполняю следующую команду:

g++ -m32 testLogin.cpp  -L/root/c++/libs  -ldvrnetsdk -o testLoginO -lpthread  -lasound 

результат:

/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_set_channels'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_mutex_trylock'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_readi'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_set_access'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_strerror'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_mutexattr_settype'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_set_rate'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_close'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_malloc'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_set_period_size'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_mutex_timedlock'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_mutexattr_destroy'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_drain'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_free'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_create'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_open'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_set_format'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_writei'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_mutexattr_init'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_hw_params_any'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'snd_pcm_prepare'
/root/c++/libs/libdvrnetsdk.so: undefined reference to 'pthread_join'
collect2: error: ld returned 1 exit status

Первое, что я сделал после этой ошибки, было включение библиотек -lpthread -lasound, я также работал над порядком параметров, но не работал. Я предлагаю любую помощь.

  • 2
    Библиотеки после кода и объектов. -pthread не -lpthread
Теги:
linker

2 ответа

0
Лучший ответ

С gcc упорядочение ссылок имеет значение.

Итак, попробуйте с другим порядком.

 g++ -m32 testLogin.cpp  -L/root/c++/libs -lpthread -lasound -ldvrnetsdk -o testLoginO

См. Этот вопрос для заказа: почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?

Кроме того, вы можете использовать опцию start-group.

gcc -m32 testLogin.cpp  -L/root/c++/libs -Wl,--start-group -lpthread -lasound -ldvrnetsdk -Wl,--end-group -o testLoginO

Изменение: по мере того как вы все еще получаете ошибку, используйте nm на строках в своей библиотеке и проверьте, не указаны ли символы, для которых указан листинг-код, в библиотеке или нет. Проверьте версию библиотеки. Возможно, вы находитесь на 64-битном ядре.

  • 0
    ТКС! Я использовал ваше второе предложение с некоторыми изменениями: gcc -m32 -fuse-ld = bfd testLogin.cpp -L / root / c ++ / libs -Wl, - start-group -pthread -lasound -ldvrnetsdk -lstdc ++ -Wl, - -end-group -o testLoginO. Это решило проблему с pthread, но у меня все еще есть неопределенная ссылка на `snd ...", что я думаю, связано с библиотекой lasound. Любая подсказка?
  • 0
    @Elmo: см. Редактирование.
1

вы пытались с помощью -pthread как флаг компоновщика... иногда это не работает с -lpthread...

Это должно работать

g++ -m32 testLogin.cpp -L/root/c++/libs -L dvrnetsdk -pthread -L asound

  • 0
    Я пытался, и я получил ту же ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню