我遇到的麻烦比我希望让CMake在Windows 7上找到sqlite3.dll
库(如果重要的那样是64位)。我已下载并将最新的sqlite3.dll
和sqlite3.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库吗?
答案 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。您应该看到如下输出:
来自CMake邮件列表的message("CMAKE_FIND_LIBRARY_SUFFIXES: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
This thread进一步证实了这种行为。如果你真的需要找到dll,你需要使用find_file
命令,例如:
CMAKE_FIND_LIBRARY_SUFFIXES: .lib
下一个问题是次要问题。如果find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...)
命令中的参数是硬编码猜测,您应该更喜欢PATHS
到HINTS
。来自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& SysWOW64实际上不是.lib文件的地方。
答案 1 :(得分:0)
我没有发现 cmake 查找 .lib。请。
请检查 cmake文件夹中的 cmake文件和 findSqlite.cmake 文件,并检查路径寻找。
当我给出“ dll ”的完整路径时,它对我来说与cmake文件中提到的输入变量相对应,它可能也对您有用。
如果您的问题仍未解决,请通知我编辑答案。