2012-06-18 3 views
1

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

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

#ifndef LED_H_ 
#define LED_H_ 

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

#endif /* LED_H_ */ 

и мой с файл 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 testtest.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.

Я настроен следующим образом: Include paths library paths

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

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 в библиотеках:

i при ошибке:

**** 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 **** 

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

[email protected]:/home/sanatan/Coustom/lib# ls 
led.o libled.so 

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

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

Sanatan

+1

вы также добавить '' -lled'' компилятора, после того, как объекты, которые вы хотите связать? – Fred

+0

Вы фактически включили библиотеку на этапе компиляции? Я не могу видеть это там? – mathematician1975

+0

Я включил пути к файлу заголовка и файлу библиотеки, как показано на двух рисунках, встроенных в гипериндикатор. Фред, можешь объяснить, как в eclipse я бы добавил этот вариант. – sanatan

ответ

2

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

-lxyz 

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

Подробной информации о том, как добавить библиотеку в проект в Eclipse, см answer to this question

+0

Привет, спасибо за ваш ответ, я смог заставить его работать, добавив опции «led» в -l в eclipse. Я думаю, gcc игнорирует префикс lib. – sanatan

+0

Теперь я могу заставить работать светодиод, но моя функция printf не работает. Программа компилируется правильно, но во время выполнения я не получаю никаких сообщений на консоли. Может быть, из-за включения файла библиотеки? – sanatan

+0

Мне никогда не приходилось использовать fflush (stdout); – sanatan

Смежные вопросы