我试图通过在共享库中定义函数来编译一个简单的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
有人可以帮我发现我在做什么错吗?
答案 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文章中学习。