cmake在windows上找到sqlite3库

时间:2013-04-06 21:50:56

标签: windows sqlite cmake

我遇到的麻烦比我希望让CMake在Windows 7上找到sqlite3.dll库(如果重要的那样是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库吗?

2 个答案:

答案 0 :(得分:7)

这里有一些问题,还有一些奇怪的Windows内容!

第一期;当在MSVC作为生成器的Windows上搜索库时,CMake将始终查找“.lib”文件 - 永远不会是“.dll”,即使您指定了例如sqlite3.dll作为NAMES的{​​{1}}参数。遗憾的是,没有正确记录,实际上CMAKE_FIND_LIBRARY_SUFFIXES的文档错误地说明了:

  

这指定当find_library命令查找库时要添加到库名称的后缀。在Windows系统上,这通常是.lib和.dll,这意味着在尝试查找foo库时,它会查找foo.dll等。

你可以轻松检查这个;只需添加

find_library

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

message("CMAKE_FIND_LIBRARY_SUFFIXES:  ${CMAKE_FIND_LIBRARY_SUFFIXES}")
来自CMake邮件列表的

This thread进一步证实了这种行为。如果你真的需要找到dll,你需要使用find_file命令,例如:

CMAKE_FIND_LIBRARY_SUFFIXES:  .lib


<小时/>

下一个问题是次要问题。如果find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...) 命令中的参数是硬编码猜测,您应该更喜欢PATHSHINTS。来自find_library的文档:

  

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


<小时/>

一个稍微严重的问题是:

PATHS

您应首先指定sqlite3d 然后sqlite3或sqlite3将被错误地选为Debug库(如果两者都可用)。


<小时/>

现在奇怪......

在Windows x64系统上,FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d ...) 部分忽略C:\ Windows \ System32目录,而使用C:\ Windows \ SysWOW64目录。

如果您在C:\ Windows \ SysWOW64中没有sqlite3.lib,那么find_xxx命令将始终失败,无论find_library参数如何。

但是,如果你有C:\ Windows \ SysWOW64 \ sqlite3.lib,那么PATHS和/或C:/Windows/SysWOW64的任意组合都是{{1} }参数找到库,但设置C:/Windows/System32 的完整路径,即使C:/Windows/System32/sqlite3.lib不存在!如果图书馆不存在,这显然是无用的;将导致链接器错误。

CMake邮件列表here再次进一步阅读。

话虽如此,如果你正在链接,你将使用.lib文件,而不是.dll和System32&amp; SysWOW64实际上不是.lib文件的地方。

答案 1 :(得分:0)

我没有发现 cmake 查找 .lib。请

请检查 cmake文件夹中的 cmake文件 findSqlite.cmake 文件,并检查路径寻找。

当我给出“ dll ”的完整路径时,它对我来说与cmake文件中提到的输入变量相对应,它可能也对您有用。

如果您的问题仍未解决,请通知我编辑答案。