C++ Linux错误加载共享库 'undefined symbol: pthread_create'

12 浏览
0 Comments

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毫秒

我已经查阅了这个问题。我认为它是相关的,但是我不知道如何将其应用到我的情况中。

有什么想法吗?

0
0 Comments

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`函数时能够正常链接并执行。

0
0 Comments

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的回答,问题得到了解决。

祝愉快编码!

0