C++ Linux错误加载共享库 'undefined symbol: pthread_create'
C++ Linux错误加载共享库 'undefined symbol: pthread_create'
我创建了一个编译良好的库。
库文件是"libTextSearch.so"。
在库中,它创建了一个线程。我在这里使用了C++11的线程:
TextSearch::TextSearch(){
std::thread t(&TextSearch::ThreadProc, this);
t.detach();
}
就像我说的,这个库编译通过并且我有"libTextSearch.so"文件。
我正试图在另一个应用程序中加载这个库:
void* handle = dlopen("libTextSearch.so", RTLD_LAZY);
if(!handle){
//std::cout << "\n Failed to load libTextSearch.so\n\n";
fprintf(stderr, "dlopen failed: %s\n", dlerror());
return 1;
}
我已经将包复制到了"/usr/lib"目录下。这是我得到的输出:
dlopen failed: /usr/lib/libTextSearch.so: undefined symbol: pthread_create
运行结束;退出值为1;实际时间:0毫秒;用户时间:0毫秒;系统时间:0毫秒
我已经查阅了这个问题。我认为它是相关的,但是我不知道如何将其应用到我的情况中。
有什么想法吗?
C++ Linux Error Loading Shared Library `undefined symbol: pthread_create`问题的原因是在链接时无法找到`pthread_create`函数的定义。解决方法是使用`dlopen`函数预先加载`pthread`库,并设置`RTLD_GLOBAL`标志。
具体的解决方法如下:
#include#include int main() { void* handlePthread = dlopen("libpthread.so.0", RTLD_GLOBAL | RTLD_LAZY); if (!handlePthread) { fprintf(stderr, "dlopen failed: %s\n", dlerror()); return 1; } // 此处可以继续执行其他代码 return 0; }
以上代码中,首先使用`dlopen`函数加载`libpthread.so.0`库,并设置`RTLD_GLOBAL`和`RTLD_LAZY`标志。如果加载失败,将会输出错误信息。
这样做的目的是为了确保在链接时能够找到`pthread_create`函数的定义,从而解决`undefined symbol: pthread_create`的问题。
通过以上方法,我们可以预先加载`pthread`库,以避免出现符号未定义的错误。这样可以确保在使用`pthread_create`函数时能够正常链接并执行。
C++ Linux Error Loading Shared Library `undefined symbol: pthread_create`问题的出现原因是在生成libTextSearch时没有正确链接到libpthread库。解决方法是在生成libTextSearch时添加`-lpthread`参数来动态链接到libpthread。
具体操作如下:
gcc -c testsearch.cpp -lpthread -o textsearch.o
这样就可以解决加载问题。然而,另一个问题出现在`std::thread t(&TextSearch::ThreadProc, this);`这一行代码上。这会导致运行时错误,因为它不喜欢被当作`pthread`来处理。不过,通过Rama的回答,问题得到了解决。
祝愉快编码!