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

C++ 通过符号链接包含共享库会导致引用未定义,c++,gcc,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 poin

我正在尝试使用一个共享库(我不知道它的源代码)。然而,我很难将它链接到我的项目中。这个库包含一个摄像头驱动程序的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\u GetNumberOfCameras
,或者我有一些范围问题。无论如何,链接器都找不到此函数的实现(根据文档,它是API的一部分)。 我进一步转储了中所有符号的列表。因此使用

readelf -Ws /usr/lib/libueye_api64.so.4.72
它有我要找的符号:

980: 00000000003372b0     5 FUNC    GLOBAL DEFAULT   12 is_GetNumberOfCameras
这让我想知道为什么我找不到它。我包括错图书馆了吗?我尝试使用
ueye_api64
进行编译,但这只会返回
找不到库
。那么,我错过了什么

编辑:我还应该提到,我是在Linux(Ubuntu14.04)下使用gcc完成这项工作的,您现在可能已经明白了这一点。

尝试更改:

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

你可以看看这个来理解为什么订单很重要。公认的答案给出了很好的解释

其主要思想是,当链接器在选项列表中遇到此库时,它只会检查库一次以解析当前未解析的符号

但所有的选择都会随之处理

所以,如果你把
-lueye_api
放在
mwe.o
之前,linker就不知道
mwe.o
,当然,它也不会试图解析任何东西(事实上,他没有任何要解析的符号)

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


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

解释为什么这会有助于成功链接。我不明白的是为什么。这些参数不是从左到右读取的吗?这意味着我必须在我的*.o?@FirefoxMetzger之前指定库,反之亦然。必须在使用符号的库/对象文件的右侧指定用于解析符号的库/对象文件。可能存在重复的
g++ mwe.o -o test -L/usr/lib -lueye_api