我正在尝试使用共享库(我不知道源代码)。但是我很难将它链接到我的项目中。该库包含一个用于摄像头驱动程序的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的一部分)。
我进一步使用
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这样做,你现在可能已经想到了。
答案 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是另一个对你有帮助的好讨论。