Компоновщик gcc не находит файл библиотеки .so

Я пытаюсь сделать небольшое приложение для моей руки. Я уже настроил набор инструментов в eclipse под linux. Теперь я пытаюсь создавать библиотеки.

вот мой заголовочный файл библиотеки led.h:

#ifndef LED_H_
#define LED_H_

extern char ledon(char lednum);
extern char ledoff(char lednum);

#endif /* LED_H_ */

и мой файл c led.c :

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <led.h>
int fd = 0;

char ledon(char lednum)
{
    switch(lednum)
    {
    case 0 :fd = open("/sys/class/leds/beaglebone::usr0/brightness", O_WRONLY);
               break;
    case 1 :fd = open("/sys/class/leds/beaglebone::usr1/brightness", O_WRONLY);
                break;
    case 2 :fd = open("/sys/class/leds/beaglebone::usr2/brightness", O_WRONLY);
                break;
    case 3 :fd = open("/sys/class/leds/beaglebone::usr3/brightness", O_WRONLY);
                break;

    }
    if (fd>0)
    {
        write(fd,"1",sizeof(char));
        close(fd);
        return 1;
     }
    else
    {
        printf("Message form library function\n Error reading the LED %d",lednum);
        return 0;
    }


}

char ledoff(char lednum)
{
    switch(lednum)
    {
    case 0 :fd = open("/sys/class/leds/beaglebone::usr0/brightness", O_WRONLY);
               break;
    case 1 :fd = open("/sys/class/leds/beaglebone::usr1/brightness", O_WRONLY);
                break;
    case 2 :fd = open("/sys/class/leds/beaglebone::usr2/brightness", O_WRONLY);
                break;
    case 3 :fd = open("/sys/class/leds/beaglebone::usr3/brightness", O_WRONLY);
                break;

    }
    if (fd>0)
    {
        write(fd,"0",sizeof(char));
        close(fd);
        return 1;
     }
    else
    {
        printf("Message form library function\n Error reading the LED %d",lednum);
        return 0;
    }


}

скомпилировав это, я получаю led.h и libled.so.

теперь я создаю тестовый файл c ledtest.c в другом проекте.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <led.h>

int main(void) {

    while(1)
    {
        ledon(2);
        sleep(1);
        ledoff(2);
        sleep(1);
    }

    return EXIT_SUCCESS;
}

Я создал две папки «include», содержащие led.h, и «lib», содержащие libled.so.

Я настроил следующим образом: Включить пути пути к библиотекам

Теперь, когда я компилирую ledtest.c, я получаю следующую ошибку

make all 
Building target: ledtest
Invoking: GCC C Linker
arm-linux-gnueabi-gcc -L/usr/arm-linux-gnueabi/lib -L/home/sanatan/Coustom/lib -o      
   "ledtest"  ./src/ledtest.o   
./src/ledtest.o: In function `main':
ledtest.c:(.text.startup+0x4): undefined reference to `ledon'
ledtest.c:(.text.startup+0x10): undefined reference to `ledoff'
collect2: ld returned 1 exit status
make: *** [ledtest] Error 1

Но если я добавлю libled.so в библиотеки:

я получаю следующую ошибку:

**** Build of configuration Release for project ledtest ****

make all 
Building file: ../src/ledtest.c
Invoking: GCC C Compiler
arm-linux-gnueabi-gcc -I/home/sanatan/Coustom/include -I/usr/arm-linux-
    gnueabi/include -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/ledtest.d" -
    MT"src/ledtest.d" -o "src/ledtest.o" "../src/ledtest.c"
Finished building: ../src/ledtest.c

Building target: ledtest
Invoking: GCC C Linker
arm-linux-gnueabi-gcc -L/usr/arm-linux-gnueabi/lib -L/home/sanatan/Coustom/lib -o 
    "ledtest"  ./src/ledtest.o   -l/home/sanatan/Coustom/lib/libled.so
/usr/lib/gcc/arm-linux-gnueabi/4.6.1/../../../../arm-linux-gnueabi/bin/ld: cannot 
    find -l/home/sanatan/Coustom/lib/libled.so
collect2: ld returned 1 exit status
make: *** [ledtest] Error 1

**** Build Finished ****

Но я уверен, что файл есть:

root@ubuntu:/home/sanatan/Coustom/lib# ls
led.o  libled.so

Может кто-нибудь, пожалуйста, помогите мне здесь, я не знаю, что делать. Поверьте мне, я сделал домашнее задание .. :)

заранее спасибо.

Санатан


person sanatan    schedule 18.06.2012    source источник
comment
Вы также добавили -lled в компилятор после объектов, которые хотите связать?   -  person Fred    schedule 18.06.2012
comment
Вы действительно включили библиотеку на этапе компиляции ?? я его там не вижу?   -  person mathematician1975    schedule 18.06.2012
comment
Я включил пути к заголовочному файлу и файлу библиотеки, как показано на двух рисунках, встроенных в гипертекст. Фред, можешь объяснить, как в eclipse добавить эту опцию.   -  person sanatan    schedule 18.06.2012


Ответы (1)


Всякий раз, когда вы хотите подключиться к библиотеке, вам нужно включить опцию

    -lxyz

чтобы связать библиотеку с именем libxyz и, возможно, указать путь к ней с помощью опции -L. Как говорится в комментарии Фреда, может показаться, что вам может понадобиться добавить параметр -lled.

Подробнее о том, как добавить библиотеку в проект в Eclipse, см. в ответьте на этот вопрос

person mathematician1975    schedule 18.06.2012
comment
Привет, спасибо за ваш ответ, я смог заставить его работать, добавив параметры led to -l в eclipse. Я предполагаю, что gcc игнорирует префикс lib. - person sanatan; 18.06.2012
comment
Теперь я могу заставить светодиод работать, но моя функция printf не работает. Программа компилируется правильно, но во время выполнения я не получаю никаких сообщений на консоли. Может ли это быть из-за включения файла библиотеки? - person sanatan; 18.06.2012
comment
никогда не приходилось использовать fflush (stdout); - person sanatan; 18.06.2012