CMake查第三⽅或者⾃⼰的库⽂件
CMake查库⽂件
使⽤cmake指定第三⽅库或者⾃⼰的⼯具库的相关⽬录
使⽤CMake可以⽅便的进⾏项⽬管理。作为初学者在使⽤过程中遇到了⼀些问题,做⼀些纪录。
问题描述
在windows下⾯做C++开发时,如果需要使⽤第三⽅库或者⾃⼰编译的⼯具库的时候,⼀般都是通过三步进⾏配置,这种⽅式在库⽂件⽐较少的时候可以通过⼿动完成配置(当然也可以通过bat脚本枚举库⽬录下⾯的⽂件,⼀起添加),然后导出属性表供以后使⽤。但是换⼀台PC,安装路径换了之后就还需要重新配置。
1)第三⽅库头⽂件路径的配置
为了能够让编译器在编译时能够到第三⽅库的头⽂件(.h、.hpp等等扩展名的头⽂件)的位置,⾸先需要将第三⽅库的头⽂件路径添加到属性当中。具体配置的位置可以在属性当中的配置属性-VC++⽬录-Include⽬录中到。否则编译时报不到头⽂件(C1083)错误。
2)第三⽅库库⽂件路径以及引⽤库名称的配置
为了能够让链接器在编译时能够到第三⽅库的库⽂件(.lib)的位置,还需要将第三⽅库的库⽂件路径添加到属性当中。具体配置的位置可以在属性当中的配置属性-VC++⽬录-Library⽬录中到。否则报不到输⼊⽂件*.lib错误(LNK1181)。
在添加库⽂件⽬录之后,我们还需要指定具体需要链接哪些库⽂件。添加库⽂件的名称可以参考第三⽅库的⽂档,当然有些库在引⽤头⽂件时,会⾃动的指明需要引⽤库的名字(例如boost),所以这个步骤在某些情况下也可以省略。但是由于⼤多数第三⽅库不⽀持这种⾃动指明引⽤库名字的⽅式,所以这个步骤还是必须⾛的过程。具体配置的位置可以在属性当中的配置属性-连接器-其他依赖中到。否则报⽆法解析的外部符号(unresolved external symbol)错误(LNK2019)。
3) dll⽂件配置
为了让应⽤程序运⾏时正确到dll⽂件,将第三⽅库dll⽂件所在⽬录添加到系统Path中(需要重启电脑⽣效)或者将dll⽂件拷贝到可执⾏⽂件(*.exe)同⼀级⽬录下(不推荐)。否则虽然编译通过,运⾏时报不到dll⽂件。
编写CMakeLists引⽤Xlnt库
编译完Xlnt C++库之后,安装Xlnt但是安装⽬录没有提供cmake配置⽂件,因此需要⾃⼰⼿动按照上⾯的操作步骤配置Xlnt,但是换⼀台电脑之后,还需要重新配置相关路径,⽐较繁琐。于是⾃⼰写了⼀个CMakeLists查Xlnt库。
第⼀:通过CMakeGUI来让我们⾃⼰指定Xlnt安装⽬录。
第⼆:通过CmakeLists⾃动查库⽂件。
1:通过CMakeGUI来让我们⾃⼰指定Xlnt安装⽬录。
Cmake的 set命令给我们提供了⼀个功能,通过CMakeGUI或者命令⾏来指定变量的值。
我们在CMakeLists中按照如下语句添加⼀个⽬录类型(PATH)的变量”XLNT_INSTALL_ROOT”
set(XLNT_INSTALL_ROOT “” CACHE PATH “xlnt install root directory”)
添加了该语句之后,CMakeGUI配置的时候会出现这个变量,我们可以指定这个变量的值为Xlnt的安装⽬录。
2:通过CmakeLists在xlnt安装⽬录下⾃动查库⽂件。
#可以通过下⾯的CMake语句判断指定的⽬录XLNT_INSTALL_ROOT是否存在
IF(EXISTS ${XLNT_INSTALL_ROOT})
MESSAGE(STATUS “set XLNT_INSTALL_ROOT to ${XLNT_INSTALL_ROOT}”)
SET(XLNT_INCLUDE_DIR ${XLNT_INSTALL_ROOT}/include)
SET(XLNT_LIBRARY_DIR ${XLNT_INSTALL_ROOT}/lib)
ELSE()
message( FATAL_ERROR “XLNT_INSTALL_ROOT: ${XLNT_INSTALL_ROOT} is not a directory.” ) ENDIF()
#判断XLNT的include⽬录是否存在
#xlnt include dir
IF(EXISTS ${XLNT_INCLUDE_DIR})
MESSAGE(STATUS “set XLNT_INCLUDE to ${XLNT_INCLUDE_DIR}”)
ELSE()
message( FATAL_ERROR “XLNT_INCLUDE_DIR: ${XLNT_INSTALL_ROOT}/include is not exist.” ) ENDIF()
#判断XLNT的lib⽬录是否存在
#xlnt library dir
IF(EXISTS ${XLNT_LIBRARY_DIR})
MESSAGE(STATUS “set XLNT_LIBRARY_DIR to ${XLNT_LIBRARY_DIR}”)
ELSE()
message( FATAL_ERROR “XLNT_LIBRARY_DIR: ${XLNT_INSTALL_ROOT}/lib is not exist.” ) ENDIF()
#判断是否到了xlnt库(find_library⾥⾯的库名字为xlnt,CMake为⾃⼰为我们查xlnt.lib⽂件)
#xlnt library
find_library(XLNT_LIBS xlnt ${XLNT_LIBRARY_DIR})
IF(EXISTS ${XLNT_LIBS})
MESSAGE(STATUS “set XLNT_LIBS to ${XLNT_LIBS}”)
ELSE()
message( FATAL_ERROR “XLNT_LIBS: ${XLNT_LIBS} is not exist.” )
ENDIF()
#添加包含⽬录和库⽬录
include_directories($ {XLNT_INCLUDE_DIR})
link_directories(${XLNT_LIBRARY_DIR})
#添加可执⾏⽂件,编译链接⽣成⽂件ADD_EXECUTABLE (xlnt_demo main.cpp)
#为可执⾏⽂件指定链接库XLNT_LIBS,即xlnt.lib TARGET_LINK_LIBRARIES (xlnt_demo ${XLNT_LIBS}) CMakeLists内容
cmake_minimum_required(VERSION2.6FATAL_ERROR)
project(Xlnt_Test)
#xlnt install directory
set(XLNT_INSTALL_ROOT""CACHE PATH"xlnt install root directory")
IF(EXISTS ${XLNT_INSTALL_ROOT})
MESSAGE(STATUS"set XLNT_INSTALL_ROOT to ${XLNT_INSTALL_ROOT}")
SET(XLNT_INCLUDE_DIR ${XLNT_INSTALL_ROOT}/include)
SET(XLNT_LIBRARY_DIR ${XLNT_INSTALL_ROOT}/lib)
ELSE()
message(FATAL_ERROR"XLNT_INSTALL_ROOT: ${XLNT_INSTALL_ROOT} is not a directory.")
ENDIF()
#xlnt include dir
IF(EXISTS ${XLNT_INCLUDE_DIR})
MESSAGE(STATUS"set XLNT_INCLUDE to ${XLNT_INCLUDE_DIR}")
ELSE()
message(FATAL_ERROR"XLNT_INCLUDE_DIR: ${XLNT_INSTALL_ROOT}/include is not exist.")
ENDIF()
#xlnt library dir
IF(EXISTS ${XLNT_LIBRARY_DIR})
MESSAGE(STATUS"set XLNT_LIBRARY_DIR to ${XLNT_LIBRARY_DIR}")
ELSE()
message(FATAL_ERROR"XLNT_LIBRARY_DIR: ${XLNT_INSTALL_ROOT}/lib is not exist.")
ENDIF()
#xlnt library
find_library(XLNT_LIBS xlnt ${XLNT_LIBRARY_DIR})
IF(EXISTS ${XLNT_LIBS})
MESSAGE(STATUS"set XLNT_LIBS to ${XLNT_LIBS}")
ELSE()
message(FATAL_ERROR"XLNT_LIBS: ${XLNT_LIBS} is not exist.")
ENDIF()
IF(XLNT_LIBS STREQUAL"")
MESSAGE("SUCCESS: FIND XLNT LIBRARY")
ENDIF()
include_directories(${XLNT_INCLUDE_DIR})
link_directories(${XLNT_LIBRARY_DIR})
SET(CMAKE_BUILD_TYPE Release)
为什么现在都用cmakeADD_DEFINITIONS(-D _XKEYCHECK_H)
ADD_EXECUTABLE(xlnt_demo main.cpp)
#set vs startup project
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}PROPERTY VS_STARTUP_PROJECT xlnt_demo) TARGET_LINK_LIBRARIES(xlnt_demo ${XLNT_LIBS})
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论