【问题标题】:ld can't find library given -Lld 找不到给定的库 -L
【发布时间】:2015-10-22 08:34:21
【问题描述】:

我有一个目标文件main.o,需要将它与./libsvm/libsvm.so.2 的共享库链接。我有以下 Makefile,但它对我不起作用。在-L./libsvm 中指定了库路径,但gcc -lsvm 仍然找不到共享库(libsvm.so.2)。

这是我的 Makefile:

CC      = g++ -g
CFLAGS  = -Wall
HEADERS = -I./libsvm
OBJ     = main.o
LIBS    = -L./libsvm

all: lib $(OBJ)
     $(CC) $(LIBS) -lsvm $(OBJ) -o main

%.o: %.c
     $(CC) $(CFLAGS) $(HEADERS) -c -o $@ $<

lib:
     cd libsvm; make

如果直接链接它们就可以了,如

ld main.o libsvm/libsvm.so.2 -o main

我想知道 Makefile 出了什么问题。错误信息如下

g++ -g -L./libsvm -lsvm main.o -o main 
ld: library not found for -lsvm 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [all] Error 1

【问题讨论】:

  • “找不到共享库”你遇到了哪些错误?
  • 您是否尝试创建指向 libsvm.so 的符号链接?
  • cc -L/usr/local/lib -lsvm main.o -o main 这不是来自您的 makefile 的配方。 libsvm.o/usr/local/lib 中吗?
  • 在我们开始帮助您之前,您需要弄清楚为什么 make 没有使用您的规则(或向我们展示您正在使用的实际 makefile)。您还需要知道您尝试链接到的库的实际位置。
  • -lname 寻找 libname.so 而不是 libname.so.2libname.so.0.2 或其他任何东西。所以你需要有可用的符号链接或通过路径链接到文件。

标签: makefile ld


【解决方案1】:

-lsvm 表示使用文件svm.so

但是您的库文件名为 svm.so.2。 (Version 2)

所以要么重命名,要么用符号链接

ln -s svm.so.2 svm.so

现在makefile应该可以工作了。

【讨论】:

  • 谢谢。这解决了我的问题。作为一个后续问题,拥有不同版本的共享库但只有一个 libsvm.so 有什么意义?
  • 确实是个好问题!您应该在 SO 上将其作为一个单独的问题提出。老实说,不知道 :-) 这些只是我的解释:如果您查看各种 lib 目录,您将看到大多数(所有?)案例 .so 和 .so.X.Y 文件符号链接。只要较新的版本向后兼容,就可以了。但如果某些包依赖它,它仍然可以使用旧库。
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2015-11-03
  • 2015-08-16
相关资源
最近更新 更多