ld找不到给定的库文件-L。

3
我有一个目标文件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

1
你尝试过创建一个指向libsvm.so的符号链接吗? - Sami Kuhmonen
@EtanReisner 但是我的方法应该可以工作,为什么不行呢? - qweruiop
1
cc -L/usr/local/lib -lsvm main.o -o main 这不是来自您的 makefile 的命令。libsvm.o 是否在 /usr/local/lib 中? - Etan Reisner
1
在我们开始帮助你之前,你需要找出为什么make没有使用你的规则(或者向我们展示你正在使用的实际makefile)。你还需要知道你试图链接的库实际上位于哪里。 - Etan Reisner
2
“-lname” 查找的是 “libname.so”,而不是 “libname.so.2” 或者 “libname.so.0.2” 或其他任何文件。因此,您需要有该符号链接或通过路径链接到该文件。 - Etan Reisner
显示剩余5条评论
1个回答

5
-lsvm 表示使用文件 svm.so。
但是你的库文件名为 svm.so.2。(版本 2)
因此,要么重命名,要么使用符号链接。
ln -s svm.so.2 svm.so

现在Makefile应该可以工作了。

1
谢谢。这解决了我的问题。作为后续问题,拥有不同版本的共享库但只有一个libsvm.so的意义是什么? - qweruiop
确实是个好问题!你应该在SO上单独提出这个问题。老实说,我不知道 :-) 这只是我的解释:如果你查看各种lib目录,你会看到大多数(全部?)情况下都有.so和.so.X.Y文件符号链接。只要新版本向后兼容,就可以了。但它仍然留下了使用旧库的可能性,如果一些软件包依赖于它。 - Valentin H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接