【问题标题】:Compile a C program in Linux using shared library [duplicate]使用共享库在 Linux 中编译 C 程序 [重复]
【发布时间】:2015-04-20 12:40:49
【问题描述】:

我正在尝试使用共享库在 Linux 中编译一个简单的 C 程序。

我将以下文件放在同一个文件夹中:

mymain.c

 #include "myclib.h"
 int main() {
   func();
   return 0;
}

myclib.h

 void func();

myclib.c

#include <stdio.h>
void func() {

   printf("hello world!!!!!!!!!!!!\n");

} 

然后我按照以下步骤操作:

  • gcc -c fPIC myclib.c(创建与内存地址无关的对象文件)

    产生:myclib.o

  • gcc -shared -fPIC -o libmyclib.so myclib.o(创建共享库)

  • gcc -c mymain.c(从 main.c 创建一个目标文件)

到目前为止一切顺利 - 然后我准备好了以下文件:

  • main.o
  • libmyclib.so

所以我尝试用这种语法创建一个程序:

gcc -o program -lmyclib -L. mymain.o

(我猜 libmyclib 中的前缀 lib 应该替换为 l?)

但我从 gc 编译器收到错误消息:

 *mymain.o: In function `main':
 mymain.c:(.text+0xa): undefined reference to `func'
 collect2: error: ld returned 1 exit status*

我也测试过这个语法:

gcc -o program mymain.c -L -lmyclib -Wl,-rpath,.

然后我得到以下错误:

 /usr/bin/ld: cannot find -lmyclib.so
 collect2: error: ld returned 1 exit status

在这两个实现中我做错了什么? 如何使用共享库将此程序编译为可执行文件?

【问题讨论】:

  • gcc -o program -lmyclib -L. mymain.o更改为gcc -o program mymain.o -lmyclib -L.
  • @PaulR -k 选项需要放在最后。
  • @FUZxxl:我不这么认为(假设您的意思是 -L ?) - 请参阅:stackoverflow.com/questions/5817269/…
  • @PaulR 我的意思是-l;抱歉,打错字了。
  • @FUZxxl:确实 - 重点是 -L-l 选项的顺序无关紧要 - 请参阅我链接的答案。唯一重要的是目标文件和库的顺序。

标签: c linux gcc shared-libraries


【解决方案1】:

您需要将-l 选项放在链接器调用命令行的末尾:

gcc -o program -L. mymain.o -lmyclib

【讨论】:

  • 感谢它的工作!但是现在当我使用 ./program 执行程序时,我收到错误消息: error while loading shared libraries: libmyclib.so: cannot open shared object file: No such file or directory 。但我会在几分钟内接受这个答案:-)
  • 您不需要更改 LD_PRELOAD 以加载位于预定义目录之外的共享对象吗?
  • 是的 - 我猜它看起来在 usr/lib 什么的?
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
相关资源
最近更新 更多