【问题标题】:Visual studio not finding spdlog.libVisual Studio 找不到 spdlog.lib
【发布时间】:2021-05-18 13:30:29
【问题描述】:

我一直在尝试创建一个简单的项目来了解 Windows 上的构建过程。 最近下载安装了spdlog库,安装文件夹位于

C:\Program Files (x86)\spdlog

具有以下目录:

  • bin:里面有spdlog.dll
  • 包括:所有关于 spdlog 的标题
  • lib:有两个 子目录 - cmake 和 pkgconfig - 和 spdlog.lib

我尝试用 cmake 将 spdlog.dll 链接到我的代码,但是根据这个link,dll 文件没有链接,合适的程序是链接到 .lib 文件。

好吧,根据最后的信息,我创建了以下 CMakeLists.txt。

cmake_minimum_required (VERSION 3.8)

set(APPNAME DrumHero)
project($APPNAME)

#C++ version
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(SOURCES src/drumhero.cpp)
set(HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/drumhero.h)

set(DEPENDENCIES_LIBS spdlog)

link_directories("C:/Program Files (x86)/spdlog/lib")
include_directories("C:/Program Files (x86)/spdlog/include")

add_executable (${APPNAME} ${SOURCES} ${HEADERS})

target_link_libraries(${APPNAME} 
                          PUBLIC ${DEPENDENCIES_LIBS})

set_target_properties(${APPNAME} PROPERTIES
    PUBLIC_HEADER "${HEADERS}")

当我尝试构建它时,Visual Studio 返回错误

LNK 1104:无法打开文件“spdlog.lib”。

我的结论是我的主要错误与通知 cmake 文件“spdlog.lib”在哪里有关,但我不知道错误到底在哪里。

我有 3 个问题:

  • 主要问题:如何更正 CMakeLists.txt 以与 spdlog 链接?
  • 附加问题 1:.lib 类似于 .a,.dll 类似于 .so?
  • 附加问题 2:我不能将我的代码链接到 .dll 文件吗?

更新 1

我已经尝试过将spdlog路径中的空格转义,但是没有成功。

更新 2

一些 cmets 提出了我可能将 x64 与 x86 混合的可能性,因此我决定重新安装 spdlog,现在将架构更改为 x64。 第二次安装是在Program Files中,所以我相信这次我使用了合适的路径库:“C:/Program Files /spdlog/include”。

但问题依然存在。

【问题讨论】:

  • .lib 被 Visual Studio 使用 .a 被 gcc 和其他编译器使用。在 c++ 中,很多时候你不能使用来自不同编译器的二进制文件。即使是同一个编译器,不同版本也不兼容。例如,Visual Studio 2015 到 2019 是二进制兼容的,但与任何其他版本的 Visual Studio 不兼容。相关:https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=msvc-160
  • 我不能将我的代码链接到 .dll 文件吗? 在使用 msvc 编译器的 Visual Studio 中,您无法链接 dll。您改为链接 dll 的 .lib 导入库。在 mingw 我相信你可以链接 dll 但我不知道限制。
  • 您是否会混合使用 32 位和 64 位?
  • 好点。 Can not open file 'spdlog.lib'. 通常表示以下一种或多种: 库不在文件夹中或按照您所说的方式命名。 2. 库已损坏,3. 您正在混合 32 位和 64 位。
  • 在 Visual Studio 中,我更改了 CMakeSettings。 json 以使用 x86-Debug,但问题仍然存在。

标签: c++ visual-studio cmake compilation


【解决方案1】:

您的构建失败,因为您将spdlog 安装在包含空格的路径中。尝试转义空格:

link_directories("C:/Program\ Files\ (x86)/spdlog/lib")

就链接而言,在 Windows 上,dll 文件是动态库,而 lib 文件是静态库。

在 Windows 上有两种使用(链接)动态库的方法:隐式和显式。两者都记录在here。如果您将spdlog 构建为一个DLL,那么您看到的spdlog.lib 只是一个导入库,操作系统将在您的应用程序启动时加载spdlog.dll(如果它可以找到该DLL)。

编辑:事实证明,spdlog 的调试版本创建了一个spdlogd.lib(注意额外的d)。问题的作者已经安装了该库的调试版本。

【讨论】:

  • 此解决方案无效,问题仍然存在。
  • 你有没有安装过调试版的spdlog?在这种情况下,您应该链接到spdlogd.lib
  • 天才。解决了!最后一个问题,调试版和普通版背后的想法是什么?
  • 我将编辑我的答案以指出这一点。长话短说:调试构建更容易调试:代码优化程度较低,因此更容易阅读生成的程序集,某些功能可能会略有不同(例如,可能会进行一些被认为昂贵的检查)等。一般来说,代码比较慢,但它更容易发现和理解错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-12
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多