【发布时间】: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