I am having more trouble than I\'d expect getting CMake to find the sqlite3.dll
library on Windows 7 (64-bit if that matters). I have downloaded and placed the late
I didn't find that cmake looks for .lib. pls.
please check the cmake file and findSqlite.cmake file inside cmake folder and check for paths it is looking for.
when I gave the full path to the "dll", it worked for me corresponding to the input variable mentioned in cmake file, and it might work for you too.
If your problem is not solved, notify me to edit the answer.
There are some issues here and also some weird Windows stuff!
First issue; when searching for a library on Windows with MSVC as the generator, CMake will always look for a ".lib" file - never a ".dll", even if you specify e.g. sqlite3.dll
as the NAMES
argument to find_library
. This is unfortunately not properly documented, in fact the docs for CMAKE_FIND_LIBRARY_SUFFIXES wrongly state:
This specifies what suffixes to add to library names when the find_library command looks for libraries. On Windows systems this is typically .lib and .dll, meaning that when trying to find the foo library it will look for foo.dll etc.
You can easily check this; simply add
message("CMAKE_FIND_LIBRARY_SUFFIXES: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
to your CMakeLists.txt. You should see output like:
CMAKE_FIND_LIBRARY_SUFFIXES: .lib
This thread from the CMake mailing list further confirms this behaviour. If you really need to find the dlls, you'll need to use the find_file command, e.g:
find_file(SQLITE3_DLL_DEBUG NAMES sqlite3d.dll PATHS ...)
The next issue is a minor one. You should prefer PATHS
to HINTS
as the argument in find_xxx
commands if it's a hard-coded guess. From the docs for find_library:
3
. Search the paths specified by theHINTS
option. These should be paths computed by system introspection, such as a hint provided by the location of another item already found. Hard-coded guesses should be specified with thePATHS
option.
A slightly more serious issue is in the line:
FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d ...)
You should specify sqlite3d first then sqlite3 or sqlite3 will incorrectly be chosen as the Debug library if both are available.
And now the weirdness...
On a Windows x64 system, the find_xxx
partially ignores the C:\Windows\System32 directory in favour of the C:\Windows\SysWOW64 one.
If you don't have the sqlite3.lib in C:\Windows\SysWOW64, then the find_library
command will always fail, regardless of the PATHS
argument.
However, if you do have C:\Windows\SysWOW64\sqlite3.lib, then any combination of C:/Windows/SysWOW64
and/or C:/Windows/System32
as the PATHS
argument finds the library, but sets the full path to C:/Windows/System32/sqlite3.lib
even if C:/Windows/System32/sqlite3.lib doesn't exist! This is obviously useless if the library isn't there; a linker error will result.
There is some further reading again from the CMake mailing list here.
Having said that, if you're linking, you'll be using the .lib files, not the .dlls, and System32 & SysWOW64 aren't really the place for .lib files.