7
There are some issues here and also some weird Windows stuff!
这里有一些问题,还有一些奇怪的Windows操作系统!
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:
第一个问题;当用MSVC搜索Windows上的一个库时,CMake会一直寻找a。lib“文件-从不a”。即使你指定了sqlite3。dll作为名称参数到find_library。不幸的是,这并没有被正确地记录下来,事实上,cmake_find_library_suffix的文档错误地表示:
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.
当find_library命令查找库时,它指定添加到库名称的后缀。在Windows系统上,这是典型的。lib和。dll,意思是当试图查找foo库时,它会查找foo。dll等。
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:
CMakeLists.txt。您应该会看到如下输出:
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:
来自CMake邮件列表的这个线程进一步证实了这种行为。如果您真的需要找到dll,您需要使用find_file命令,例如:
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
:
下一个问题是次要的。如果这是一个硬编码的猜测,那么您应该更喜欢在find_xxx命令中作为参数提示的路径。来自find_library的文档:
3
. Search the paths specified by the HINTS
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 the PATHS
option.
3所示。搜索提示选项指定的路径。这些路径应该是由系统内省所计算的路径,例如由已经找到的另一个项目的位置提供的提示。硬编码的猜测应该用路径选项指定。
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.
您应该首先指定sqlite3d,如果两者都可用,那么sqlite3或sqlite3将被错误地选择为调试库。
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.
在Windows x64系统,find_xxx部分忽略了C:\Windows\System32目录支持C:\Windows\SysWOW64。
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.
如果你没有sqlite3。自由在C:\Windows\ SysWOW64,find_library命令总是失败,无论路径参数。
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.
然而,如果你确实有C:\Windows\SysWOW64\sqlite3.lib,然后是C:/Windows/SysWOW64和/或C:/Windows/System32的任意组合,因为路径参数找到了库,但是将完整路径设置为C:/Windows/System32/sqlite3。自由即使C:/ Windows / System32系统/ sqlite3。自由不存在!如果库不存在,这显然是没有用的;一个链接器错误将导致。
There is some further reading again from the CMake mailing list here.
这里还有一些来自CMake邮件列表的进一步阅读。
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.
已经说过,如果链接的话,将使用.lib文件,而不是.dll, System32 & SysWOW64并不是.lib文件的真正位置。