未定义的引用,但ld找到共享的lib并且lib有符号

时间:2019-05-01 16:35:50

标签: c++ shared-libraries undefined-reference

我正在尝试使用提供给我的头文件中定义的一些功能,但会不断出现未定义的引用错误。

第一次问,非常努力地遵循格式,并用谷歌搜索我发现的每个主题。

我得到了LsApi.so和LsApi.h

LsApi.h:

...

// Linux porting
typedef int HWND, BOOL;

extern int LSDisconnect(short hConnect, HWND   hWnd);

...

main.cpp:

#include "LsApi.h"


int main(int argc, char** argv) {

    int retVal = 0;
    HWND b = 0;
    short devID;   

    retVal= LSDisconnect (devID,b);

    return 0;
}

尝试使用clang ++查看ld命令

clang++ -O3 -v -m32 -g -Wall -I. -L/usr/lib -L/usr/local/lib/ -lLsApi main.cpp

(抱歉,我在西班牙语中有ubuntu会尝试翻译错误)

...
...
/tmp/main-bfde60.o: in function `main':
/home/jere/LSAPI/main.cpp:11: undefined reference to `LSDisconnect(short, int)'

库在那里

locate libLsApi.so

/usr/local/lib/libLsApi.so

ld --verbose告诉我ld可以找到库:

(不要粘贴完整的ld命令,因为它由clang生成的非常大)

...
attempt to open /usr/local/lib//libLsApi.so succeeded
-lLsApi (/usr/local/lib//libLsApi.so)
...

nm告诉我该符号在那里:

nm /usr/local/lib//libLsApi.so | grep LSDisconnect
0004b751 T LSDisconnect

.so格式似乎没有问题:

file /usr/local/lib/libLsApi.so
/usr/local/lib/libLsApi.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, with debug_info, not stripped

libLsApi.so依赖项看起来不错

(我不认为这很重要,因为该符号位于根据nm定义的库中)

ldd /usr/local/lib/libLsApi.so
    linux-gate.so.1 (0xf7f0b000)
    libpthread.so.0 => /lib32/libpthread.so.0 (0xf492b000)
    libdl.so.2 => /lib32/libdl.so.2 (0xf4926000)
    libz.so.1 => /usr/lib32/libz.so.1 (0xf4907000)
    librt.so.1 => /lib32/librt.so.1 (0xf48fd000)
    libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf4777000)
    libm.so.6 => /lib32/libm.so.6 (0xf46ac000)
    libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf468e000)
    libc.so.6 => /lib32/libc.so.6 (0xf44b5000)
    /lib/ld-linux.so.2 (0xf7f0d000)

观察:

给我一​​个似乎很奇怪的东西:使用提供的shell脚本安装了LsApi.h和LsApi.so,但是我必须将LsApi.so的名称更改为libLsApi.so,以使链接器能够找到它。

尝试使用gcc是因为它的库很旧,并在Ubuntu Jaunty中尝试了所有相同的操作,并获得了相同的结果。

0 个答案:

没有答案