C++ 当*.so使用其他*.so函数时,如何使用dlopen和dlsym

C++ 当*.so使用其他*.so函数时,如何使用dlopen和dlsym,c++,c,dlopen,dlsym,C++,C,Dlopen,Dlsym,我有以下使用dlopen和dlsym的代码 main.cpp #include <stdio.h> #include <dlfcn.h> int main(int argc,char** argv) { void* handler; handler = dlopen("./libsql.so",RTLD_LAZY); if(handler){ int (*insert)(const char*); char* err

我有以下使用dlopen和dlsym的代码

main.cpp

#include <stdio.h>
#include <dlfcn.h>
int main(int argc,char** argv) {
    void* handler;
    handler = dlopen("./libsql.so",RTLD_LAZY);
    if(handler){
        int (*insert)(const char*);
        char* error=NULL;

        dlerror();    /* Clear any existing error */

        *(void **) (&insert) = dlsym(handler, "openAndInsert");
        if ((error = dlerror()) == NULL)  {
            (*insert)(argv[1]);
        }
        else {
            printf("Error in dlsym\n");
        }
    }
    else {
        printf("dlopen error\n");
    }
    return 0;
}
编译命令:g++-fPIC-shared-o libsql.so libsql.cpp

#include <sqlite3.h>
#include <string.h>
#include <stdio.h>
#include "libsql.h"

int openAndInsert(const char* sql) {
    sqlite3 *db;
    sqlite3_stmt *stmt;
    sqlite3_initialize();
    int rc = sqlite3_open("./database.db", &db);
    if(rc==0){
        rc = sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
        if(rc==0) {
            if(sqlite3_step(stmt)){
                printf("Done\n");
            }
            else {
                printf("execute error\n");
            }
            sqlite3_finalize(stmt);
        }
        else {
            printf("prepare error\n");          
        }
        sqlite3_close(db);
    }
    else {
        printf("open error\n");
    }
    sqlite3_shutdown();
}
现在,当我运行应用程序时,我得到如下错误

./a.out:符号查找错误:./libsql.so:未定义的符号:sqlite3\u初始化


但是libsqlite3已经安装,并且可以与其他程序配合使用。

当我使用下面的命令生成我的*.so文件时,它可以正常工作

g++-fPIC-shared-o libsql.so libsql.cpp-lsqlite3

#ifndef LIBSQL_H_
#define LIBSQL_H_
#ifdef __cplusplus
extern "C" {
#endif

int openAndInsert(const char* sql);
#ifdef __cplusplus
}
#endif

#endif