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

该库(及其两个符号链接(symbolic link))位于/ 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进行此操作,您现在可能已经知道了。

最佳答案

尝试更改:

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中所有未解析的符号添加到未解析的符号列表中,然后使用ueye_api库成功解析所有符号。

最后,this是另一个很好的讨论,将对您有所帮助。

关于c++ - 通过symlink包含共享库会导致 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35972703/

10-09 21:03