(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)
461

被折叠的 条评论
为什么被折叠?



