我有一个目录结构如下:
/
|
+--- /lib
| libsomething.a
| libsomething.so
|
+----/obj
anObjFile.o
当我从obj
目录中运行以下命令时:
g++ -L../lib -lsomething anObjFile.o
我收到undefined reference
错误。显然gcc
无法找到libsomething.a
。
但是现在如果我删除libsomething.so
然后重新运行命令,链接就会成功。
根据gcc documentation -lsomething
应扩展为libsomething.a
。那么为什么libsomething.so
的存在导致库搜索失败?另外,我该如何解决这个问题?
我在Linux Mint 12上使用gcc
版本4.6.1。
答案 0 :(得分:1)
.so文件是一个动态库,这意味着每次运行程序时都会使用它。在这种情况下,您需要告诉您的操作系统(在这种情况下为Mint)动态库所在的位置,以便您的prgramm可以在运行时找到它。
.a文件是一个静态库,意味着它所需的功能将在链接时复制到您的prgramm中。所以你的prgramm可以在没有库文件的情况下运行。
如果没有其他说法,gcc会假设您要使用动态库。如果它可以找到.so文件,它将使用它而不是.a文件。如果你想告诉gcc使你的程序静态(使用.a文件)你可以在你的gcc调用中添加-static。
然而,在使用动态库时链接失败的原因尚不清楚。你是如何安装/构建库的?