用C / C ++创建库 - ld找不到我的库

时间:2009-05-29 18:31:03

标签: c compilation

我正在尝试学习如何在Linux环境中创建一个C / C ++库,但我遇到了一个问题(可能是一个微不足道的问题),在线教程没有帮助解决。

为了明确,我们假设我有一个包含以下代码的foo.c文件:

//file: foo.c
#include <stdio.h>
void hello(void)
{
  printf("hello!\n");
}

一个foo.h:

//file: foo.h
void hello(void);

和一个使用foo.c函数hello()的程序,名为prog.c:

//file: prog.c

#include "foo.h"

int main(void)
{
  hello();
  return 0;
}

这三个文件都在同一目录下。然后我编译了foo.c:

gcc -fPIC -c foo.c

并获得了一个foo.o文件。然后我用ld创建了库文件:

ld -G foo.o -o libfoo.so

但是当我尝试使用:

编译prog.c时
gcc -o prog prog.c -lfoo

我收到错误消息:

/usr/bin/ld: cannot find -lfoo
collect2: ld returned 1 exit status

我确信这是一种微不足道的路径问题,但我找不到解决办法。所以我的问题是,如果上面的这个过程是错误的,或者我必须将libfoo.so文件放在一个特殊的路径中。

另一个问题是,如果我使用g ++而不是gcc,这会如何变化。

感谢。

编辑:

我知道我可以将prog.c和foo.c编译为prog.o和foo.o然后链接它们以生成可执行文件。但在我最初的问题中,我想以一种方式编译foo.c,我可以将它分发给将在自己的程序中使用我的函数的人。

2 个答案:

答案 0 :(得分:6)

默认情况下,

ld不会搜索当前目录。如果您希望它执行此操作,您需要使用-L命令行选项,因此如果您的库位于当前目录中,则需要将-L.添加到最后一个gcc调用。如果库是动态链接的,您还需要将当前目录添加到环境变量LD_LIBRARY_PATH(我假设您使用的是Linux)。

当然,如果你的库在任何其他非标准路径中,你需要使用它而不是当前目录。

答案 1 :(得分:3)

尝试

gcc -o prog prog.c -lfoo -L.

-L开关将其参数添加到ld查找库文件的路径集。 g ++的语法相同。