在makefile中找不到.so library -l

Posted

技术标签:

【中文标题】在makefile中找不到.so library -l【英文标题】:can't find .so library -l in makefile 【发布时间】:2020-05-20 17:53:02 【问题描述】:

我是 makefile 的新手,我想制作一个 .so 库并在 main.o 文件中使用它,我想使用当前目录中的库。我怎样才能使它工作?

CFLAGS = -Wall -g
CC = g++

all: main.o mylib.so
    $(CC) main.o mylib.so -o runProg

mylib.so : b1.o a1.o head1.h header2.h header3.h
    $(CC) $(CFLAGS) -shared -fPIC -o mylib.so b1.o a1.o

b1.o: b1.cc b1.h
    $(CC) $(CFLAGS) -fPIC b1.cc

a1.o: a1.cc
    $(CC) $(CFLAGS) -fPIC a1.cc

main.o: main.cc 
    $(CC) $(CFLAGS) main.cc -L. -lmylib

我得到的错误:

c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lmylib
collect2.exe: error: ld returned 1 exit status
makefile:28: recipe for target 'main.o' failed
mingw32-make: *** [main.o] Error 1

非常感谢任何帮助和纠正这项工作!

【问题讨论】:

【参考方案1】:

所以有些事情是错误的。当您使用$(CC) 仅用于编译时,您必须指定-c。所以

b1.o: b1.cc b1.h
    $(CC) -c $(CFLAGS) -fPIC b1.cc

a1.o: a1.cc
    $(CC) -c $(CFLAGS) -fPIC a1.cc

从 main.cc 到 main.o 是一个编译步骤,因此不需要共享库(但确实需要 -c 选项)。所以

main.o: main.cc 
    $(CC) -c $(CFLAGS) main.cc

程序链接步骤确实需要库选项,并且应该提及正在生成的文件(而不是all)。所以

runProg: main.o mylib.so
    $(CC) main.o -o runProg -L. -lmylib

尚未检查任何内容,但希望对您有所帮助。毫无疑问,如果有任何错误,将得到纠正。

【讨论】:

非常感谢!我更新了我的代码,更新后我得到了这个:mylib.so: file not recognized: File format not recognized 指的是$(CC) main.o mylib.so -o runProg -L. -lmylib这一行 不确定,你的图书馆真的叫mylib.so吗? 您不应该将mylib.so 添加到链接行:您拥有-lmylib,这正是您所需要的。另外,如果你想使用-lmylib,那么你的共享库必须以lib为前缀:例如,它应该命名为libmylib.so @MadScientist 是的,但我不确定 mylib.so 是真正的库名称,还是只是这个问题的虚构名称。 库名称应以lib 开头,在makefile 中对该库的任何引用都应使用库的全名libxxx.so,但-l 选项应删除lib前缀和.so 后缀,即-lxxx。有意义吗?

以上是关于在makefile中找不到.so library -l的主要内容,如果未能解决你的问题,请参考以下文章

makefile文件中如何使用 export LD_LIBRARY_PATH=/myfile/makefile:$LD_LIBRARY_PATH

ld.so.1:协议:致命:libstdc++.so.6:在 Solaris 11 中找不到版本“GLIBCXX_3.4.20”

使用boost在eclipse中找不到libboost_system.so.1.43.0

makefile-动态链接库(*.so)

mac笔记本中找不到library文件夹的解决办法

运行 UWSGI 时在 SO 中找不到符号 _PyByteArray_Type