【问题标题】:Makefile Linking with shared library failsMakefile 与共享库的链接失败
【发布时间】:2013-07-18 06:50:52
【问题描述】:

我正在尝试编写一个共享库并尝试链接它以形成最终的可执行文件。

生成文件

mystring.out:main.c libmystring.so
    gcc -I. -L/home/pradheep/myexploration/mystring/ -lmystring main.c -o mystring.out

libmystring.so:mystring.o
    gcc -shared -Wl,-soname,libmystring.so -o libmystring.so mystring.o

libmystring.a:mystring.o
    ar -r libmystring.a mystring.o

mystring.o:mystring.h mystring.c
    gcc -Wall -g -c -fPIC -I. mystring.c

clean:
    rm *.o 
    rm *.a
    rm *.so
    rm *.out

这是错误信息:

 gcc -I. -L/home/pradheep/myexploration/mystring/ -lmystring  main.c -o mystring.out
 /tmp/ccS9UDPS.o: In function `main':
main.c:(.text+0x2d): undefined reference to `mystrcpy'
main.c:(.text+0x5a): undefined reference to `mystrncpy'
main.c:(.text+0x87): undefined reference to `mystrncpy'
main.c:(.text+0xa4): undefined reference to `mystrlen'
collect2: ld returned 1 exit status
make: *** [mystring.out] Error 1

我已经导出了LD_LIBRARY_PATH

echo $LD_LIBRARY_PATH
/home/pradheep/myexploration/mystring

我的 libmystring.so 的输出

 000004ca T mystrncpy
 0000045c T mystrcpy

我错过了什么?

解决方案:

问题在于库 -l 的使用顺序。应该在源文件之后使用 Dayal rai 指出的正确顺序是 gcc -I。 -L/home/pradheep/myexploration/mystring/main.c -lmystring -o mystring.out 并欢呼它的工作原理。

【问题讨论】:

  • 你在 main.c 文件中包含了 mystring.h 吗?
  • 是的,我已经添加了它......事实上,在命令行中也是如此
  • @Omkant 头文件与链接器错误无关。重要的是 -lmystring 链接器标志的位置。
  • IOW,它是否与 Makefile 中的以下更改行链接? gcc -I. -L/home/pradheep/myexploration/mystring/ main.c -lmystring -o mystring.out
  • 请注意自己的未来。在打破你的头两天之前问SO:P

标签: c++ c makefile


【解决方案1】:

链接器的传统行为是在命令行指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在任何使用它的源文件或目标文件之后。

【讨论】:

  • 你是正确的。我也不知道。将规则更改为 gcc -I。 -L/home/pradheep/myexploration/mystring/main.c -lmystring -o mystring.out 成功了。我从不知道我犯了这个愚蠢的错误。也会更新问题
  • 我添加了一个新部分,以便寻找相同答案的人显而易见:) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2019-05-26
  • 2019-08-23
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多