相关疑难解决方法(0)

为什么gcc中'-l'选项的顺序很重要?

我正在尝试编译一个使用udis86库的程序.实际上我正在使用库的用户手册中给出的示例程序.但是在编译时,它会给出错误.我得到的错误是:

example.c:(.text+0x7): undefined reference to 'ud_init'
example.c:(.text+0x7): undefined reference to 'ud_set_input_file'
.
.
example.c:(.text+0x7): undefined reference to 'ud_insn_asm'
Run Code Online (Sandbox Code Playgroud)

我使用的命令是:

$ gcc -ludis86 example.c -o example 
Run Code Online (Sandbox Code Playgroud)

按照用户手册中的说明进行操作.

显然,链接器无法链接libudis库.但如果我改变命令:

$ gcc example.c -ludis86 -o example 
Run Code Online (Sandbox Code Playgroud)

它开始工作.那么可以请某人解释第一个命令的问题是什么?

c linker gcc ld

69
推荐指数
3
解决办法
2万
查看次数

使用共享库在Linux中编译C程序

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

我在同一个文件夹中共同拥有以下文件:

mymain.c

 #include "myclib.h"
 int main() {
   func();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

myclib.h

 void func();
Run Code Online (Sandbox Code Playgroud)

myclib.c

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

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

} 
Run Code Online (Sandbox Code Playgroud)

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

  • gcc -c fPIC myclib.c (创建memoryaddress独立的objectfile)

    产生: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*
Run Code Online (Sandbox Code Playgroud)

我也测试了这个语法:

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

c linux gcc shared-libraries

5
推荐指数
1
解决办法
2525
查看次数

标签 统计

c ×2

gcc ×2

ld ×1

linker ×1

linux ×1

shared-libraries ×1