cmake的发现窗户上的sqlite3库(cmake find sqlite3 library on

2019-08-20 02:03发布

我有更多的麻烦比我期望得到的CMake找到sqlite3.dll在Windows 7(64位,如果该事项)库。 我已经下载并放置最新sqlite3.dllsqlite3.def文件到C:\Windows\System32 。 我现在用的是FindSqlite3.cmake以下模块:

IF( SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY_RELEASE AND SQLITE3_LIBRARY_DEBUG )
    SET(SQLITE3_FIND_QUIETLY TRUE)
ENDIF( SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY_RELEASE AND SQLITE3_LIBRARY_DEBUG )

FIND_PATH( SQLITE3_INCLUDE_DIR sqlite3.h )

FIND_LIBRARY(SQLITE3_LIBRARY_RELEASE NAMES sqlite3 )

FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d HINTS /usr/lib/debug/usr/lib/ C:/Windows/System32/ )

IF( SQLITE3_LIBRARY_RELEASE OR SQLITE3_LIBRARY_DEBUG AND SQLITE3_INCLUDE_DIR )
SET( SQLITE3_FOUND TRUE )
ENDIF( SQLITE3_LIBRARY_RELEASE OR SQLITE3_LIBRARY_DEBUG AND SQLITE3_INCLUDE_DIR )

IF( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )
# if the generator supports configuration types then set
# optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
IF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
SET( SQLITE3_LIBRARIES optimized ${SQLITE3_LIBRARY_RELEASE} debug ${SQLITE3_LIBRARY_DEBUG} )
ELSE( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
    # if there are no configuration types and CMAKE_BUILD_TYPE has no value
    # then just use the release libraries
SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_RELEASE} )
ENDIF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
ELSEIF( SQLITE3_LIBRARY_RELEASE )
SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_RELEASE} )
ELSE( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )
SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_DEBUG} )
ENDIF( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )

IF( SQLITE3_FOUND )
IF( NOT SQLITE3_FIND_QUIETLY )
MESSAGE( STATUS "Found Sqlite3 header file in ${SQLITE3_INCLUDE_DIR}")
MESSAGE( STATUS "Found Sqlite3 libraries: ${SQLITE3_LIBRARIES}")
ENDIF( NOT SQLITE3_FIND_QUIETLY )
ELSE(SQLITE3_FOUND)
IF( SQLITE3_FIND_REQUIRED)
MESSAGE( FATAL_ERROR "Could not find Sqlite3" )
ELSE( SQLITE3_FIND_REQUIRED)
MESSAGE( STATUS "Optional package Sqlite3 was not found" )
ENDIF( SQLITE3_FIND_REQUIRED)
ENDIF(SQLITE3_FOUND)

这工作得很好的Linux,而不是Windows上。 我花了几个小时,现在正在尝试小的变化,没有运气CMake的其他变量。 现在看来似乎应该直截了当得到的CMake找到这个dll 。 我能得到一些帮助,得到这个发现在Windows中的sqlite3库?

Answer 1:

这里有一些问题,也有一些奇怪的Windows的东西!

首要问题; 在Windows库与MSVC作为发电机进行搜索时,CMake的总是会寻找一个名为“.lib”文件-从来没有一个“.DLL”,即使您指定例如sqlite3.dll作为NAMES参数find_library 。 这是不幸的是没有适当的记录,实际上对于文档CMAKE_FIND_LIBRARY_SUFFIXES错误状态:

这是用来指定后缀时find_library命令查找库添加到库名。 在Windows系统中,这是典型的.lib和.dll,这意味着试图找到富库将查找foo.dll等时

你可以很容易地检查这一点; 只需添加

message("CMAKE_FIND_LIBRARY_SUFFIXES:  ${CMAKE_FIND_LIBRARY_SUFFIXES}")

你的CMakeLists.txt。 你应该看到输出如下:

CMAKE_FIND_LIBRARY_SUFFIXES:  .lib 

这个线程从CMake的邮件列表,进一步证实了这一行为。 如果你真的需要找到的DLL,你需要使用find_file命令,例如:

find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...)



接下来的问题是较小的。 你应该更喜欢PATHSHINTS作为参数find_xxx命令,如果它是一个硬编码的猜测。 从文档的find_library

3 。 搜索由指定的路径HINTS选项。 这些应该是由路径系统内省计算,例如通过另一项目的位置提供一个提示已经找到。 硬编码猜测应与被指定的PATHS的选项。



稍微更严重的问题是在该行:

FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d ...)

您应指定sqlite3d 第一则sqlite3的或者如果两者都可用的sqlite3会错误地被选为调试库。



而现在的怪事?

在Windows x64系统上,该find_xxx地忽略C:\ Windows \ System32目录赞成的C:\ WINDOWS \ SysWOW64中之一。

如果你没有在C sqlite3.lib:\ WINDOWS \ SysWOW64中,那么find_library命令总是会失败,而不管的PATHS说法。

但是,如果有C:\ WINDOWS \ Syswow64资料\ sqlite3.lib,然后任意组合C:/Windows/SysWOW64和/或C:/Windows/System32PATHS参数发现库中,但设置的完整路径C:/Windows/System32/sqlite3.lib 即使C:/Windows/System32/sqlite3.lib不存在 ! 这显然是无用的,如果库中不存在; 将导致连接错误。

有一些进一步从CMake的邮件列表再次阅读这里 。

话说回来,如果你链接,你将要使用的.lib文件,而不是.dll,可和System32下与SysWOW64中是不是真的.lib文件的地方。



文章来源: cmake find sqlite3 library on windows