链接共享库

问题描述 投票:0回答:1

尝试链接共享库会在

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
,成功链接到可执行文件,然后找不到其功能。

c gcc shared-libraries ld
1个回答
0
投票

试试这个:

#!/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
© www.soinside.com 2019 - 2024. All rights reserved.