尝试链接共享库会在
main
中抛出未定义的引用。确切的错误是:
/usr/bin/ld: /tmp/cc3pGAwi.o: in function `main':
main.c:(.text+0x1e): undefined reference to `sum'
collect2: error: ld returned 1 exit status
这是我的文件:
build.sh
#!/usr/bin/sh
PROJECT_NAME="foo"
CFLAGS="-Wall -Wextra -pedantic"
gcc $CFLAGS -shared -fPIC -o libsubmodule.so submodule.c
gcc $CFLAGS -o $PROJECT_NAME -L. -Wl,-rpath=. -lsubmodule main.c
main.c
#include <stdio.h>
#include "submodule.h"
int main(void)
{
printf("%s", "Help Me!!!\n");
printf("%i\n",sum(2, 3));
return 0;
}
子模块.h
#ifndef SUBMODULE_H_
#define SUBMODULE_H_
int sum(int a, int b);
#endif // SUBMODULE_H_
子模块.c
#include <stdio.h>
#include "submodule.h"
int sum(int a, int b)
{
return a + b;
}
我希望这个程序能够编译并打印
Help me!!!
5
跑步时。
如果我直接将 submodule.c 编译到我的可执行文件中,程序将按预期运行。
我认为我的 libsubmodule.so 工作正常,因为
nm libsubmodule.so
有这条线
00000000000010f9 T sum
我认为我的代码应该可以工作,因为我正在
#include
处理头文件,使用 -L.
和 -Wl,-rpath=.
告诉链接器在哪里可以找到库,并且我使用 -lsubmodule
将其链接到我的可执行文件中。
我很确定我正确找到了该库,因为它会抛出不同的错误。我还认为我正确地找到了标题。我不明白该库如何包含
sum
,成功链接到可执行文件,然后找不到其功能。
试试这个:
#!/usr/bin/sh
PROJECT_NAME="foo"
CFLAGS="-Wall -Wextra -pedantic"
gcc $CFLAGS -shared -fPIC -o libsubmodule.so submodule.c main.c
gcc $CFLAGS -o $PROJECT_NAME -L. -Wl,-rpath=. -lsubmodule main.c
运行如下:
bash build.sh
./foo
您将归档
foo
和 libsubmodule.so
输出:
Help Me!!!
5