gpt4 book ai didi

c++ - 通过符号链接(symbolic link)包含共享库导致 undefined reference

转载 作者:行者123 更新时间:2023-11-30 02:32:49 24 4
gpt4 key购买 nike

我正在尝试使用一个共享库(我不知道它的源代码)。但是我很难将它链接到我的项目中。该库包含一个用于相机驱动程序的 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++ - 通过符号链接(symbolic link)包含共享库导致 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35972703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com