cmake не удается открыть файл optimized . lib.библиотека при попытке добавить процесс Boost

#windows #boost #cmake

#Windows #boost #cmake

Вопрос:

Я создаю службу Windows на C . Я хотел бы добавить процесс Boost в свое приложение, но по какой-то причине я продолжаю получать эту ошибку:

ССЫЛКА: неустранимая ошибка LNK1104: не удается открыть файл ‘optimized.lib’

Все работало нормально до того, как я попытался добавить Boost. Когда я открываю свое решение Visual Studio, я замечаю, что приложение пытается установить связь с optimized.lib и debug.lib библиотекой, с которой я не знаком. CMake пытается установить связь с этими библиотеками только тогда, когда я пытаюсь добавить Boost.

Моя структура каталогов:

 UpdateService/
    CMakeLists.txt
    app/
        CMakeLists.txt
        Driver.cpp
    build/
    include/
        stdafx.h
        UpdateService/
            # a bunch of *.h files
    src/
        CMakeLists.txt
        # a bunch of *.cpp files
  

Мой UpdateService/CMakeLists.txt файл:

 cmake_minimum_required(VERSION 3.12...3.14)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()

project(UpdateService
        VERSION 1.0
        DESCRIPTION "Service that runs the update manager"
        LANGUAGES CXX)

add_subdirectory(src)
add_subdirectory(app)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT UpdateService)
  

Мой UpdateService/src/CMakeLists.txt файл:

 cmake_minimum_required(VERSION 3.12...3.14)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()

set(FMT_DIR "E:/Repositories/fmt-5.3.0")
set(FMT_INCLUDE "${FMT_DIR}/include")
set(SPDLOG_INCLUDE "E:/Repositories/spdlog/include")

set(Boost_DEBUG ON)
# set(Boost_USE_STATIC_LIBS ON)
# set(Boost_USE_STATIC_RUNTIME ON)
find_package(Boost 1.67 REQUIRED COMPONENTS system filesystem)

# Needed to suppress a warning in boost process.
add_compile_definitions(_SCL_SECURE_NO_WARNINGS)

add_library(UpdateServiceLib STATIC
    "${CMAKE_SOURCE_DIR}/include/stdafx.h"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/CLI11.hpp"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/Config.h"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/CmdParams.h"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/LogUtils.h"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/ServiceBase.h"
    "${CMAKE_SOURCE_DIR}/include/UpdateService/UpdateService.h"
    "${FMT_DIR}/src/format.cc"
    "Config.cpp"
    "CmdParams.cpp"
    "LogUtils.cpp"
    "ServiceBase.cpp"
    "UpdateService.cpp")

target_include_directories(UpdateServiceLib PUBLIC 
    "${Boost_INCLUDE_DIRS}"
    "${CMAKE_SOURCE_DIR}/include"
    "${FMT_INCLUDE}"
    "${SPDLOG_INCLUDE}")

target_link_libraries(UpdateServiceLib PUBLIC "${Boost_LIBRARIES}")
  

Мой UpdateService/app/CMakeLists.txt файл:

 cmake_minimum_required(VERSION 3.12...3.14)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()

add_executable(UpdateService "Driver.cpp")

target_include_directories(UpdateService 
    PRIVATE "${CMAKE_SOURCE_DIR}/include" "${FMT_INCLUDE}" "${SPDLOG_INCLUDE}")

target_link_libraries(UpdateService PRIVATE UpdateServiceLib)
  

Я создаю проект с чем-то вроде этого:

 rmdir /S /Q build
mkdir build
mkdir buildx64
pushd buildx64
cmake -G "Visual Studio 14 2015 Win64" ....
cmake --build . --config Debug
popd
  

Ответ №1:

Удалите двойные кавычки вокруг ${Boost_LIBRARIES} .

Двойные кавычки указывают CMake рассматривать вложенное значение как одиночный параметр, но Boost_LIBRARIES на самом деле это список (многозначная переменная).


Обычно двойные кавычки используются только для:

  • «строковые литералы» (когда аргумент не содержит разыменований переменных), например

     "abc"
      
  • когда точно известно, что аргумент представляет собой единственное значение, например

     "${CMAKE_SOURCE_DIR}/include"
      

Множественное число для слова «БИБЛИОТЕКИ» подразумевает, что Boost_LIBRARIES переменная может содержать несколько значений, поэтому не заключайте ее в двойные кавычки.

Комментарии:

1. Это и возня с CMAKE_CXX_FLAGS_RELEASE и CMAKE_CXX_FLAGS_DEBUG сделали свое дело.