通过符号链接包含共享库会导致未定义的引用

时间:2016-03-13 16:26:17

标签: c++ gcc

我正在尝试使用共享库(我不知道源代码)。但是我很难将它链接到我的项目中。该库包含一个用于摄像头驱动程序的API,这几乎是一堆函数(据我所知,没有结构)。

库(以及它的两个符号链接)位于/ usr / lib中并被称为

libueye_api64.so.4.72 - the library
libueye_api.so.1      - a symlink pointing to above library
libueye_api.so        - another symlink pointing to libueye_api64.so.4.72

还有一个位于/ usr / include中的头文件名为ueye.h,它是库的头文件(至少我认为是这样)。

使用简单示例mwe.cpp

#include "ueye.h"
int main()
{
    int device_count = 0;
    int error_value = is_GetNumberOfCameras(&device_count);
    return 0;
}

我试图编译(成功)和链接,我得到以下内容:

~/Documents/mwe$ g++ -I/usr/include -c mwe.cpp
~/Documents/mwe$ g++ -L/usr/lib -lueye_api mwe.o -o test
mwe.o: In function `main':
mwe.cpp:(.text+0x17): undefined reference to `is_GetNumberOfCameras'
collect2: error: ld returned 1 exit status

这应该意味着库中没有实现is_GetNumberOfCameras或者我有一些范围问题。无论如何,链接器无法找到此函数的实现(根据文档,它是API的一部分)。 我进一步使用

转储.so中所有符号的列表
readelf -Ws /usr/lib/libueye_api64.so.4.72

有我想要的符号:

980: 00000000003372b0     5 FUNC    GLOBAL DEFAULT   12 is_GetNumberOfCameras

这让我想知道为什么我找不到它。我包括错误的图书馆吗?我尝试使用ueye_api64进行编译,但这只会返回cannot find library。那么,我错过了什么?

编辑:我还应该提一下,我在Linux(Ubuntu 14.04)下使用gcc这样做,你现在可能已经想到了。

1 个答案:

答案 0 :(得分:3)

尝试改变:

g++ -L/usr/lib -lueye_api mwe.o -o test

要:

g++ mwe.o -o test -L/usr/lib -lueye_api

您可以查看此SO discussion以了解订单的重要性。接受的答案给出了很好的解释。

主要思想是链接器检查库以在符合选项列表中的此库时仅解析当前未解析的符号一次。

但是所有选项都会被处理。

因此,如果您在-lueye_api链接器之前放置mwe.o并不知道mwe.o,当然,它并没有尝试解决任何问题(事实上,他没有任何符号要解决。)

另一方面,如果你在-lueye_api链接器之后放置mwe.o,首先将mwe.o中所有未解析的符号添加到未解析的符号列表中,然后使用{{{}}解析所有符号。 1}}库成功。

最后,this是另一个对你有帮助的好讨论。