我正在尝试学习如何在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,我可以将它分发给将在自己的程序中使用我的函数的人。
答案 0 :(得分:6)
ld
不会搜索当前目录。如果您希望它执行此操作,您需要使用-L
命令行选项,因此如果您的库位于当前目录中,则需要将-L.
添加到最后一个gcc调用。如果库是动态链接的,您还需要将当前目录添加到环境变量LD_LIBRARY_PATH
(我假设您使用的是Linux)。
当然,如果你的库在任何其他非标准路径中,你需要使用它而不是当前目录。
答案 1 :(得分:3)
尝试
gcc -o prog prog.c -lfoo -L.
-L开关将其参数添加到ld查找库文件的路径集。 g ++的语法相同。