C++ Linux 加载共享库时出错“未定义的符号:pthread_create”



我创建了一个编译得很好的库。库文件为"libTextSearch.so">

在库内部,它创建了一个thread。我为此使用了 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.sonn";
    fprintf(stderr, "dlopen failed: %sn", dlerror());
    return 1;
}

我已经将软件包复制到/usr/lib。这是我得到的输出:

dlopen failed: /usr/lib/libTextSearch.so: undefined symbol: pthread_create
RUN FINISHED; exit value 1; real time: 0ms; user: 0ms; system: 0ms

我查过这个问题。我认为这是相关的,但我不知道将其应用于我的情况。

有什么想法吗?

只需事先dlopen thread库即可RTLD_GLOBAL

void* handlePthread = dlopen("libpthread.so.0", RTLD_GLOBAL | RTLD_LAZY);
if(!handlePthread ){
    //std::cout << "n  Failed to load libpthread.so.0nn";
    fprintf(stderr, "dlopen failed: %sn", dlerror());
    return 1;
}

我不能完全确定,因为我不知道你是如何构建这个项目的,或者 libTextSearch.so 是如何构建的,但是在生成libTextSearch时,你需要以某种方式链接到libpthread。通常在构建环境中,您将提供 -lpthread 作为参数以动态链接到它。

gcc -c testsearch.cpp -lpthread -o textsearch.o 

例如

最新更新