LittleBuster
@LittleBuster

Линковка Си библиотеки к С++ приложению. Как?

Есть Си библиотека, собранная следующим образом:

gcc -fPIC -c DHT_Driver/common_dht_read.c -o DHT_Driver/common_dht_read.o -std=gnu99
gcc -fPIC -c DHT_Driver/pi_dht_read.c -o DHT_Driver/pi_dht_read.o -std=gnu99
gcc -fPIC -c DHT_Driver/pi_mmio.c -o DHT_Driver/pi_mmio.o -std=gnu99
gcc -shared DHT_Driver/common_dht_read.o DHT_Driver/pi_dht_read.o DHT_Driver/pi_mmio.o -o DHT_Driver/libdht_driver.so


Инклужу .h файл с экспортируемой функцией
extern int pi_dht_read(int type, int pin, float* temperature, float* humidity);


Но при сборке g++ приложения с линковкой этой либы пишет ошибку:
g++ main.cpp -ldht_driver
/tmp/ccxRKglu.o: In function `main':
main.cpp:(.text+0x1c): undefined reference to `pi_dht_read(int, int, float*, float*)'
collect2: error: ld returned 1 exit status


А если создаю Си приложение и компилю gcc то никаких проблем нет.
  • Вопрос задан
  • 3293 просмотра
Решения вопроса 1
@mamkaololosha
#ifdef __cplusplus, а не #ifdef cplusplus
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Samuel_Leonardo
Попробуйте
extern "C" int pi_dht_read(int type, int pin, float* temperature, float* humidity);
Ответ написан
risik
@risik
Программист
Все, как посоветовал @Samuel_Leonardo, но, скорее всего, Вы подаете этот код С компилятору. С компилятор не знает про extern "C". О нем знает C++. Должно быть что-то вроде:
#ifdef cplusplus
extern "C"
#endif
int pi_dht_read(int type, int pin, float* temperature, float* humidity);


или лучше:
#ifdef cplusplus
extern "C" {
#endif

int pi_dht_read(int type, int pin, float* temperature, float* humidity);

#ifdef cplusplus
}
#endif
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы