E-r*_*ich 2 windows sqlite cmake
我遇到的麻烦比我希望让CMake sqlite3.dll
在Windows 7上找到这个库(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)
Run Code Online (Sandbox Code Playgroud)
这适用于Linux,但不适用于Windows.我现在花了几个小时尝试对其他CMAKE变量进行小的更改而没有运气.似乎应该直接让CMake找到这个dll
.我能帮助你在Windows上找到sqlite3库吗?
这里有一些问题,还有一些奇怪的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.您应该看到如下输出:
Run Code Online (Sandbox Code Playgroud)CMAKE_FIND_LIBRARY_SUFFIXES: .lib
来自CMake邮件列表的这个帖子进一步证实了这种行为.如果你真的需要找到dll,你需要使用find_file
命令,例如:
find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...)
Run Code Online (Sandbox Code Playgroud)
下一个问题是次要问题.你应该更喜欢PATHS
以HINTS
作为参数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文件的地方.
归档时间: |
|
查看次数: |
4031 次 |
最近记录: |