【问题标题】:MSVC 2017 missing libboost_filesystem-vc141-mt-gd-x32-1_66.lib errorMSVC 2017 缺少 libboost_filesystem-vc141-mt-gd-x32-1_66.lib 错误
【发布时间】:2018-02-25 20:34:15
【问题描述】:

我正在尝试在 Windows 上创建一个动态库,但我遇到了 Boost 问题,我不断收到此错误

1>LINK : fatal error LNK1104: cannot open file 'libboost_filesystem-vc141-mt-gd-x32-1_66.lib'

问题是,根据http://www.boost.org/doc/libs/1_66_0/more/getting_started/windows.html#header-only-libraries,这两个库应该是仅标头,仅标头

我正在使用的cmake

cmake_minimum_required(VERSION 3.8)

project(mod_autoindex)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")

SET (BOOST_ROOT "C:/Program Files (x86)/boost/boost_1_66_0")
SET (BOOST_INCLUDEDIR "${BOOST_ROOT}/boost")

if (UNIX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra")
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

include_directories(${Boost_INCLUDE_DIR})
include_directories("../../include")
include_directories("../../include/sza")
include_directories("./include")


file(GLOB_RECURSE CPP_SRCS ${CMAKE_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE HEADERS ${CMAKE_SOURCE_DIR}/include/*.hpp)

set(SOURCE_FILES ${CPP_SRCS} ${HEADERS})
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME})

知道我做错了吗?

cmake . -G "Visual Studio 15 2017 Win64" 的 cmake 输出

-- The C compiler identification is MSVC 19.11.25547.0
-- The CXX compiler identification is MSVC 19.11.25547.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.65.1
-- Found the following Boost libraries:
--   filesystem
--   system
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/theo/Desktop/cpp_zia/modules/mod_autoindex

所以解决方案生成似乎工作正常,但在那之后,当我尝试构建 MSBuild mod_autoindex.sln 时,我收到以下错误

LINK : fatal error LNK1104: cannot open file 'libboost_filesystem-vc141-mt-gd-1_65_1.lib' [C:\Users\theo\
Desktop\cpp_zia\modules\mod_autoindex\mod_autoindex.vcxproj]

@update 这里是我当前的 cmake

cmake_minimum_required(VERSION 3.8)

project(mod_autoindex)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")

set(BOOST_ROOT "C:/Program Files (x86)/boost/boost_1_65_1")
set(Boost_ADDITIONAL_VERSIONS 1.65.1)

set(BOOST_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS filesystem REQUIRED)

if (UNIX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra")
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else()
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

include_directories(${Boost_INCLUDE_DIR})
include_directories("../../include")
include_directories("../../include/sza")
include_directories("./include")


file(GLOB_RECURSE CPP_SRCS ${CMAKE_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE HEADERS ${CMAKE_SOURCE_DIR}/include/*.hpp)
MESSAGE( STATUS "BOOST libraries: " ${Boost_LIBRARIES} )

add_library(${PROJECT_NAME} SHARED ${CPP_SRCS} ${HEADERS})
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})

【问题讨论】:

    标签: visual-c++ boost cmake


    【解决方案1】:

    许多Boost 库确实只是标题,但filesystem 不是。

    我将使用CMake 的方式通过适当的 find_package 模块添加库依赖项,而不是手动执行操作:

    set(BOOST_ROOT "C:/Program Files (x86)/boost/boost_1_65_1")
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREADED ON)
    find_package(Boost COMPONENTS filesystem REQUIRED)
    include_directories(${Boost_INCLUDE_DIRS})
    ...
    target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
    

    Boost 编译器的二进制文件可以在https://sourceforge.net/projects/boost/files/boost-binaries/ 下载

    如果CMake 没有找到您的Boost 安装(CMake 3.10.2 版本 FindBoost.cmake 模块确实知道高达Boost 1.65.1 的版本),您可以尝试在find_package 调用之前添加

    set(Boost_ADDITIONAL_VERSIONS 1.66.0) 
    

    但是

    Boost 从版本1.66.0 开始更改了其命名方案。 CMake 直到版本 3.10.2 不知道这个方案,因此无法处理它。您需要改用Boost 1.65.1

    根据@ComicSansMS 的评论编辑:

    不要将Boost 路径硬编码到CMakeLists.txt,而是根据环境变量BOOST_ROOT 设置它,或者将其作为参数提供给CMake 调用。

    所以转到你的项目路径(你的CMakeLists.txt 存储的路径)

    mkdir build
    cd build
    

    要么做

    set BOOST_ROOT=C:\Program Files (x86)\boost\boost_1_65_1
    cmake .. -G "Visual Studio 15 2017"  
    

    或致电

    cmake .. -G "Visual Studio 15 2017" -DBOOST_ROOT="C:\Program Files (x86)\boost\boost_1_65_1"
    

    以后你可以使用CMake的构建模式来构建你的整个项目

    cmake --build . --target ALL_BUILD --config Release -- /nologo /verbosity:minimal /maxcpucount
    

    【讨论】:

    • 或者你在 CMakeCache.txt 中手动输入库的名称
    • 在安装 boost 1.65.1 并使用您的 cmake 示例后,我仍然收到错误消息:Unable to find the requested Boost libraries. Boost version: 1.65.1 Boost include path: C:/Program Files (x86)/boost/boost_1_65_1 Could not find the following Boost libraries: boost_filesystem Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.
    • .lib 假设在 boost 目录中,我无法手动找到它们:/ 我使用提供的 exe 安装了 lib,我应该也运行 boostrap.bat 吗?
    • 不,引导程序设置了构建 Boost 包的必要工具。你下载并安装了什么包?您在CMake 通话中使用什么生成器?在添加建议的更改之前,您是否删除了 CMakeCache.txt 文件?如果构建 32 位库,则库应位于 lib-msvc-14.1 目录中,如果构建 64 位库,则应位于 lib64-msvc-14.1 目录中。
    • 请不要在您的 CMake 脚本中硬编码 BOOST_ROOT。这应该由调用 CMake 的用户设置,而不是脚本本身。事实上,您只需设置BOOST_ROOT 环境变量即可获得相同的效果。请注意,Boost 1.66 是already supported on CMake master。如果您不介意修补本地安装,只需将 CMake 3.10 安装的 find 脚本替换为新脚本即可。
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多