【发布时间】: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