..

记录一次在ubuntu20.04下的sqlite3和libevent的使用

sqlite3

下载sqlite-version-3.8.5的源代码 开始编译

  3rd cd sqlite-version-3.8.5 
  sqlite-version-3.8.5 mkdir build
  sqlite-version-3.8.5 cd build 
  build pwd
#这里获取build路径
/home/shecannotsee/Desktop/AllCode/3rd/sqlite-version-3.8.5/build
  build cd ..
  sqlite-version-3.8.5 ./configure --prefix=/home/shecannotsee/Desktop/AllCode/3rd/sqlite-version-3.8.5/build
#这里设置构建路径
  sqlite-version-3.8.5 make#开始构建
#......
  sqlite-version-3.8.5 make install# 这一步将所需文件放入build中
  sqlite-version-3.8.5 tree build 
build
├── bin
   └── sqlite3
├── include
   ├── sqlite3ext.h
   └── sqlite3.h
└── lib
    ├── libsqlite3.a
    ├── libsqlite3.la
    ├── libsqlite3.so -> libsqlite3.so.0.8.6
    ├── libsqlite3.so.0 -> libsqlite3.so.0.8.6
    ├── libsqlite3.so.0.8.6
    └── pkgconfig
        └── sqlite3.pc

4 directories, 9 files

然后编写cmakelist.txt

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PROJECT_NAME "sqlite3_test")
#
get_filename_component(test ${CMAKE_SOURCE_DIR} DIRECTORY)
get_filename_component(AllCode ${test} DIRECTORY)
message(STATUS "AllCode's path:${AllCode}")# /home/shecannotsee/Desktop/AllCode
set(libraries "${AllCode}/libraries")
#
set(sqlite3 "${libraries}/sqlite3")
#
set(CMAKE_CXX_FLAGS "-g")# 断点无效处理方案
project(${PROJECT_NAME})
# include
include_directories(
  ${sqlite3}/include)
# lib
link_directories(
  ${sqlite3}/lib
)

file(GLOB_RECURSE SRC "${CMAKE_SOURCE_DIR}/main.cpp")
add_executable(${PROJECT_NAME}
        ${SRC}
        )

# 链接库
target_link_libraries(${PROJECT_NAME} sqlite3 pthread dl)#注意链接顺序,有可能导致生成可执行程序失败

main.cpp->来源于sqlite3官方举例

//
// Created by shecannotsee on 2022/9/28.
//
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=3 ){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    return(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return(1);
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

程序编译链接成功了,但是并没有正确使用的错误警告

Usage: /home/shecannotsee/Desktop/AllCode/test/sqlite3_test/cmake-build-debug/sqlite3_test DATABASE SQL-STATEMENT

ps:使用sudo apt-get install sqlite3 libsqlite3-dev安装sqlite3以及开发包之后,对应文件的路径为

ubuntu20.04通过apt installlib
lib文件在/usr/lib/x86_64-linux-gnu
头文件在/usr/include
可执行文件在bin

缺点是版本可能需要手动选择,笔者使用apt install 最后安装的版本是3.31.0

libevent

下载源代码

  3rd cd libevent-release-2.1.12-stable 
  libevent-release-2.1.12-stable mkdir build
  libevent-release-2.1.12-stable cd build
  build cmake .. 
# ......
  build make
# ......
# 可见生成了include文件夹和lib文件夹

cmakelists.txt

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PROJECT_NAME "libevent_test")
###################################################
get_filename_component(test ${CMAKE_SOURCE_DIR} DIRECTORY)
get_filename_component(AllCode ${test} DIRECTORY)
message(STATUS "AllCode's path:${AllCode}")# /home/shecannotsee/Desktop/AllCode
set(libraries "${AllCode}/libraries")
###################################################
set(libevent "${libraries}/libevent-2.1.12")
###################################################
set(CMAKE_CXX_FLAGS "-g")# 断点无效处理方案
project(${PROJECT_NAME})
# include
include_directories(
        ${libevent}/include)
# lib
link_directories(
        ${libevent}/lib
)
###################################################
file(GLOB_RECURSE SRC "${CMAKE_SOURCE_DIR}/main.cpp")
add_executable(${PROJECT_NAME}
        ${SRC}
        )
###################################################
# 链接库
target_link_libraries(${PROJECT_NAME} event pthread)

main.cpp->只是为了测试编译链接过程而不是功能

//
// Created by shecannotsee on 2022/9/28.
//
#include <event.h>

int main() {
  struct event_base* base = event_init();
  event_base_free(base);
  return 0;
};


一点小细节:在build中生成的include文件夹是不完整的,源代码中的include文件夹依赖生成的include中的文件,所以需要整合一下include文件夹,也就是将生成的include文件夹和源代码中的按照目录格式放一起即可