无法编译和链接动态库

时间:2018-12-07 18:22:45

标签: c shared-libraries

我试图通过在共享库中定义函数来编译一个简单的hello世界,但是在编译主程序时我得到了:

/tmp/hello-ca67ea.o: In the function 'main':
hello.c:(.text+0x1a): reference to 'greeting(char const*)' not defined
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试过使用 Clang GCC 进行相同的错误。

我已经搜索过SO,但是没有找到类似的东西。

目录如下:

shared-test
 |
 |--greeting.c
 |--greeting.h
 |--hello.c

hello.c

#include "greeting.h"

int main ()
{
    greeting("Daniel");
    return 0;
}

问候。h

#ifndef GREETING_H
#define GREETING_H

void greeting(const char* text);

#endif

问候。c

#include <stdio.h>
#include "greeting.h"

void greeting(const char* text)
{
    printf("%s\n", text);
}

greeting.so 正在使用clang greeting.c -o greeting.so -shared -fPIC

进行编译

我正在尝试使用clang hello.c -o hello -Igreeting

来打个招呼

有人可以帮我发现我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

clang hello.c -o hello -Igreeting

试图编译并链接,但是您没有提供要链接的库的名称:

clang hello.c -o hello -Igreeting greeting.so #<= greeting.so added

然后,您应该可以使用以下命令运行输出:

LD_LIBRARY_PATH=. ./hello 

这个想法是,将把lib放在您的系统库路径中,并且由于您还没有这样做,所以LD_LIBRARY_PATH环境变量是一种使它不使用就可以工作的技巧。

在Linux上使用gcc / clang,您还可以对完整路径进行硬编码:

clang hello.c -o hello -Igreeting $PWD/greeting.so

或者您可以使动态链接程序搜索相对于可执行文件位置的依赖性

clang hello.c -o hello -Igreeting '-Wl,-rpath=$ORIGIN' greeting.so

使用上述两种方法中的任何一种,您都不再需要LD_LIBRARY_PATH=.部分。

动态库还有很多,我建议您进一步研究它们,例如,从Ulrich Drepper的DSO Howto文章中学习。