我试图编译我的程序,它返回这个错误:

usr/bin/ld: cannot find -l<nameOfTheLibrary>

在我的makefile中,我使用命令g++并链接到我的库,这是一个符号链接到我的库位于另一个目录。

是否有一个选项添加,使其工作,请?


当前回答

我试图链接到的库有一个非标准的名称(即没有'lib'前缀),所以他们建议使用这样的命令来编译它-

包含lib/cspice。一个- lm

其他回答

在g++编译期间,如果使用-Loption改变Makefile可能不合适,则通过make define LIBRARY_PATH。我把额外的库放在/opt/lib中,所以我做了:

$ export LIBRARY_PATH=/opt/lib/

然后运行make以成功编译和链接。

使用共享库运行程序定义:

$ export LD_LIBRARY_PATH=/opt/lib/

在执行程序之前。

我试图链接到的库有一个非标准的名称(即没有'lib'前缀),所以他们建议使用这样的命令来编译它-

包含lib/cspice。一个- lm

似乎没有任何答案可以解决初学者在第一时间未能安装所需库的常见问题。

在Debianish平台上,如果libfoo缺失,你可以经常用类似的东西来安装它

apt-get install libfoo-dev

开发工作需要包的-dev版本,即使是简单的开发工作,如编译源代码以链接到库。

包名有时需要一些修饰(libfoo0-dev?没有lib前缀的Foo-dev ?等等),或者你可以简单地使用发行版的包搜索来精确地找出哪些包提供了特定的文件。

(如果有不止一个,你需要找出它们之间的区别。选择最酷或最受欢迎的是一种常见的捷径,但对于任何严肃的开发工作来说都不是可接受的过程。)

对于其他体系结构(最明显的是RPM),应用类似的过程,尽管细节有所不同。

编译时

当g++说不能找到-l< nameoftheelibrary >时,这意味着g++查找的文件是lib{nameoftheelibrary}。但它无法在共享库搜索路径中找到它,而共享库搜索路径默认指向/usr/lib和/usr/local/lib或者其他地方。

要解决这个问题,您应该在这些搜索路径中提供库文件(lib{nameoftheelibrary}.so),或者使用-L命令选项。-L{path}告诉g++(实际上是ld)在默认路径之外查找路径{path}中的库文件。

示例:假设在/home/taylor/libswift. .有一个库你想把你的应用链接到这个库。在这种情况下,你应该为g++提供以下选项:

g++ main.cpp -o main -L/home/taylor -lswift

注意1:-l选项在开始和结束时获取库名,不包含lib和.so。 注意2:在某些情况下,库文件名后面跟着它的版本,例如libswift.so.1.2。在这些情况下,g++也无法找到库文件。解决这个问题的一个简单方法是创建一个到libswift.so.1.2的符号链接,称为libswift.so。


运行时

当你将你的应用链接到一个共享库时,库必须在你运行应用时保持可用。在运行时,你的应用(实际上是动态链接器)在LD_LIBRARY_PATH中寻找它的库。它是一个存储路径列表的环境变量。

示例:在我们的libswift。例如,动态链接器找不到libswift。因此在LD_LIBRARY_PATH(指向默认搜索路径)中。要解决这个问题,您应该将该变量附加到路径libswift。现在也是这样。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor

如果你的库名是libxyz。因此,它位于路径上,说:

/home/user/myDir

然后将其链接到您的程序:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog