我正在尝试学习如何在Linux环境中创建一个C/C++库,但我遇到了一个问题(可能是一个微不足道的问题),在线教程没有帮助解决.
为了明确我们说我有一个foo.c文件,其代码如下:
//file: foo.c
#include <stdio.h>
void hello(void)
{
printf("hello!\n");
}
Run Code Online (Sandbox Code Playgroud)
一个foo.h:
//file: foo.h
void hello(void);
Run Code Online (Sandbox Code Playgroud)
以及一个使用foo.c函数hello()的程序,名为prog.c:
//file: prog.c
#include "foo.h"
int main(void)
{
hello();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这三个文件都在同一目录下.然后我编译了foo.c:
gcc -fPIC -c foo.c
Run Code Online (Sandbox Code Playgroud)
并得到一个foo.o文件.然后我用ld创建了库文件:
ld -G foo.o -o libfoo.so
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用以下代码编译prog.c时:
gcc -o prog prog.c -lfoo
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:
/usr/bin/ld: cannot find -lfoo
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我确信这是一种微不足道的路径问题,但我找不到解决方案.所以我的问题是,如果上面的这个过程是错误的,或者我必须将libfoo.so文件放在一个特殊的路径中.
另一个问题是,如果我使用g ++而不是gcc,这会如何变化.
谢谢.
编辑:
我知道我可以将prog.c和foo.c编译为prog.o和foo.o然后链接它们以生成可执行文件.但在我最初的问题中,我想以一种可以分发给将在自己的程序中使用我的函数的人的方式编译foo.c.
ld默认情况下不搜索当前目录.如果您希望它执行此操作,您需要使用-L命令行选项,因此如果您的库位于当前目录中,则需要添加-L.到上一个gcc调用.如果库是动态链接的,你还需要将当前目录添加到环境变量中LD_LIBRARY_PATH(我假设你在linux上).
当然,如果您的库在任何其他非标准路径中,则需要使用它而不是当前目录.