cmake在windows上找到sqlite3库

E-r*_*ich 2 windows sqlite cmake

我遇到的麻烦比我希望让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)
Run Code Online (Sandbox Code Playgroud)

这适用于Linux,但不适用于Windows.我现在花了几个小时尝试对其他CMAKE变量进行小的更改而没有运气.似乎应该直接让CMake找到这个dll.我能帮助你在Windows上找到sqlite3库吗?

Fra*_*ser 7

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

首要问题; 当在MSVC作为生成器的Windows上搜索库时,CMake将始终寻找".lib"文件 - 永远不会是".dll",即使您指定例如sqlite3.dll作为NAMES参数find_library.遗憾的是,没有正确记录,事实上CMAKE_FIND_LIBRARY_SUFFIXES错误地说明了以下文档:

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

你可以轻松检查这个; 简单地说

message("CMAKE_FIND_LIBRARY_SUFFIXES:  ${CMAKE_FIND_LIBRARY_SUFFIXES}")
Run Code Online (Sandbox Code Playgroud)

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

CMAKE_FIND_LIBRARY_SUFFIXES:  .lib
Run Code Online (Sandbox Code Playgroud)

来自CMake邮件列表的这个帖子进一步证实了这种行为.如果你真的需要找到dll,你需要使用find_file命令,例如:

find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...)
Run Code Online (Sandbox Code Playgroud)



下一个问题是次要问题.你应该更喜欢PATHSHINTS作为参数find_xxx的命令,如果它是一个硬编码的猜测.来自以下文档find_library:

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



一个稍微更严重的问题是:

FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d ...)
Run Code Online (Sandbox Code Playgroud)

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



而现在奇怪......

在Windows x64系统上,find_xxx部分忽略C:\ Windows\System32目录,而不是C:\ Windows\SysWOW64目录.

如果在C:\ Windows\SysWOW64中没有sqlite3.lib,则find_library无论PATHS参数如何,该命令都将始终失败.

不过,如果你这样做有C:\ WINDOWS\Syswow64资料\ sqlite3.lib,那么任何的组合C:/Windows/SysWOW64和/或C:/Windows/System32作为PATHS参数发现库中,但设置的完整路径,C:/Windows/System32/sqlite3.lib 即使C:/Windows/System32/sqlite3.lib没有按不存在!如果图书馆不存在,这显然是无用的; 将导致链接器错误.

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

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