【问题标题】:gcc linker not finding the .so library filegcc 链接器找不到 .so 库文件
【发布时间】:2012-06-18 14:10:17
【问题描述】:

我正在尝试为我的手臂目标制作一个小型应用程序。我已经在linux下的eclipse中设置了工具链。现在我正在尝试构建库。

这是我的库头文件 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。

我的配置如下: Include paths library paths

现在当我编译 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

谁能帮帮我,我不知道该怎么办。相信我,我做了功课.. :)

提前致谢。

萨纳坦

【问题讨论】:

  • 您是否也将-lled 添加到编译器中,在您要链接的对象之后?
  • 你真的在编译步骤中包含了这个库吗?那里看不到?
  • 我已经包含了头文件和库文件的路径,如嵌入在超链接中的两张图片所示。 Fred,你能解释一下我如何在 Eclipse 中添加该选项吗?

标签: c eclipse ubuntu arm beagleboard


【解决方案1】:

当你想链接到一个库时,你需要包含选项

    -lxyz

链接到名为 libxyz 的库,并可能使用 -L 选项包含指向它的路径。正如 Fred 的评论所说,您可能需要添加 -lled 选项。

有关如何在 Eclipse 中将库添加到项目的详细信息,请参阅answer to this question

【讨论】:

  • 您好,感谢您的回答,我可以通过在 Eclipse 中将“led”添加到 -l 选项来使其工作。我猜 gcc 忽略了“lib”前缀。
  • 现在我可以让 LED 工作了,但我的 printf 功能不工作。该程序可以正确编译,但在运行时我没有在控制台上收到任何消息。会不会是因为包含了库文件?
  • 我从来没有使用过 fflush(stdout);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多