在linux中链接共享对象时出现问题
我已经收到了.so文件在linux中链接共享对象时出现问题,linux,g++,shared-libraries,Linux,G++,Shared Libraries,我已经收到了.so文件 ldd libTodoAPI.so linux-vdso.so.1 => (0x00007ffc766b8000) libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fead8e3f000) libsqlite3.so => /usr/lib/libsqlite3.so (0x00007fead8b6a000) libQt5Net
ldd libTodoAPI.so
linux-vdso.so.1 => (0x00007ffc766b8000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fead8e3f000)
libsqlite3.so => /usr/lib/libsqlite3.so (0x00007fead8b6a000)
libQt5Network.so.5 => /usr/lib/libQt5Network.so.5 (0x00007fead8804000)
libQt5Script.so.5 => /usr/lib/libQt5Script.so.5 (0x00007fead838b000)
libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0x00007fead7c4f000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fead78cd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fead76b7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fead72ed000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fead70e9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fead6ecc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fead6bc3000)
libicui18n.so.53 => /usr/lib/libicui18n.so.53 (0x00007fead6777000)
libicuuc.so.53 => /usr/lib/libicuuc.so.53 (0x00007fead63ec000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007fead61ea000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fead5fe2000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fead5cd1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fead949a000)
libicudata.so.53 => /usr/lib/libicudata.so.53 (0x00007fead4649000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fead43d9000)
和标题
#ifndef TODO_API_H
#define TODO_API_H
#include <string>
using namespace std;
namespace todoarea {
class TodoAPI{
public:
static string checkDoer();
static string getInformation();
static string callTask(string funcName, string param);
static string Done(string param);
static string returnStatus(string param);
static string Close();
};
}
#endif //TODO_API_H
如果我尝试查看so文件
nm -s libTodoAPI.so
nm: libTodoAPI.so: no symbols
也
当我使用-D选项尝试nm时,它列出了很多函数(大部分看起来像Qt)
问题:如何使用此库在linux中创建应用程序?我做错了什么?我尝试动态调用函数,但失败了。任何帮助都将不胜感激。您在GCC发行版与
libtoapi之间的ABI中断中遇到了麻烦。因此
是构建的,也是编译代码时使用的。看
故障排除
如果您收到链接器错误,这些错误与对符号的未定义引用有关,这些符号涉及
std::_cxx11名称空间或标记[abi:cxx11],那么它可能表示您是
尝试将使用不同值编译的对象文件链接到一起
_GLIBCXX\u使用\u CXX11\u ABI宏。这通常发生在链接到以下第三方库时:
使用较旧版本的GCC编译。如果无法重建第三方库
使用新的ABI,您将需要使用旧的ABI重新编译代码
我认为您可能需要指定共享库的路径
-L/path/to/your/so-lTodoAPI
。试试这个:我确实尝试了-L选项,我甚至将这个.so文件复制到了/usr/lib和/usr/local/lib。我怀疑这个.so文件是用Qt库编译的,可能有不同的格式或结构,但我不确定。我是linux新手。谢谢,我添加了-D_GLIBCXX_USE_CXX11_ABI=1选项并通过了。当我尝试执行该程序时,我遇到了“符号查找错误:/usr/lib/libssl.so.1.0.0:未定义的符号:EVP\u idea\u cbc”这是另一个问题吗?这似乎是
g++ load.cpp -lTodoAPI
/tmp/ccs1hwWP.o: In function `main':
load.cpp:(.text+0x27): undefined reference to `todoarea::TodoAPI::checkDoer[abi:cxx11]()'
load.cpp:(.text+0x33): undefined reference to `todoarea::TodoAPI::getInformation[abi:cxx11]()'
collect2: error: ld returned 1 exit status
nm -s libTodoAPI.so
nm: libTodoAPI.so: no symbols
nm -DC libTodoAPI.so | grep todoarea
000000000000a63a T todoarea::TodoAPI::Done(std::string)
000000000000a098 T todoarea::TodoAPI::callTask(std::string, std::string)
0000000000009e9c T todoarea::TodoAPI::getInformation()
000000000000a398 T todoarea::TodoAPI::returnStatus(std::string)
0000000000009ca0 T todoarea::TodoAPI::checkDoer()
000000000000a8dc T todoarea::TodoAPI::Close()