(Edit by king)毕业设计是标准的 linux c 应用程序,写了一些代码,准备用动态链接库的形式进行编译。
本来准备自己手工写makefile文件的,看KDE中这么多程序都是用了cmake进行管理,也尝试着使用cmake来管理源代码的依赖和编译。
由于程序还没有完全写完,首先尝试的是编译成动态链接库的部分在最外层创建一个CMakeLists.txt文件,用来描述源代码之间的关联。
project(PAM_OTP) cmake_minimum_required (VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PAM_OTP_SOURCE_DIR}/cmake) find_package(SQLite3 REQUIRED) add_library(otp SHARED src/otp_client.c) add_library(otptoken SHARED src/token_manage.c) target_link_libraries(otptoken ${SQLITE3_LIBRARIES})
首先需要定义一个项目的名称,使用project命令。
然后,定义了编译这个项目,需要的cmake的最小版本号,这个在cmake网站上写的有的问题,按照上面写的会提示参数错误。
再就是设置CMAKE_MODULE_PATH这个变量,因为这个应用需要使用到sqlite3,需要写个cmake文件来寻找sqlite3库和头文件是否存在,这个cmake文件的路径,就是在这个变量里面设置的。这里在原有路径的基础上,增加了项目源代码文件夹下的cmake文件夹。
然后就是查找依赖,这里查找的是sqlite3,默认的cmake查找文件(位于/usr/share/cmake/Modules)中是没有这个的查询方式的,所以需要自己定义,具体定义的方法,也是网上找来的。这里将sqlite3设置为必须库,如果找不到,cmake命令会执行失败,将停止生成最终的makefile文件。
后面两句话,就是添加需要创建的库文件,选项SHARED,标注这个需要被编译成动态链接库。
最后的一句,是将找到的sqlite3库在编译otptoken这个动态链接库的时候进行链接。
最后再说下那个查找sqlite3库的文件:FindSQLite3.cmake
# - Find SQLite3 # Find the SQLite includes and library # This module defines # SQLITE3_INCLUDE_DIR, where to find mysql.h # SQLITE3_LIBRARIES, the libraries needed to use MySQL. # SQLITE3_FOUND, If false, do not try to use MySQL. # # Copyright (c) 2006, Jaroslaw Staniek, <js@iidea.pl> # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. if(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES) set(SQLITE3_FOUND TRUE) else(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES) find_path(SQLITE3_INCLUDE_DIR sqlite3.h /usr/include /usr/local/include $ENV{ProgramFiles}/SQLite/include $ENV{SystemDrive}/SQLite/include $ENV{ProgramFiles}/SQLite $ENV{SystemDrive}/SQLite $ENV{ProgramFiles}/SQLite3/include $ENV{SystemDrive}/SQLite3/include $ENV{ProgramFiles}/SQLite3 $ENV{SystemDrive}/SQLite3 ) find_library(SQLITE3_LIBRARIES NAMES sqlite3 PATHS /usr/lib /usr/local/lib $ENV{ProgramFiles}/SQLite/lib $ENV{SystemDrive}/SQLite/lib $ENV{ProgramFiles}/SQLite $ENV{SystemDrive}/SQLite $ENV{ProgramFiles}/SQLite3/lib $ENV{SystemDrive}/SQLite3/lib $ENV{ProgramFiles}/SQLite3 $ENV{SystemDrive}/SQLite3 ) if(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES) set(SQLITE3_FOUND TRUE) message(STATUS "Found SQLite3: ${SQLITE3_INCLUDE_DIR}, ${SQLITE3_LIBRARIES}") else(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES) set(SQLITE3_FOUND FALSE) message(STATUS "SQLite3 not found.") endif(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES) mark_as_advanced(SQLITE3_INCLUDE_DIR SQLITE3_LIBRARIES) endif(SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARIES)