Visual Studio 10 не удается создать тестовый пример (32-битный) регулярного выражения повышения (1.47): ошибка ссылки 1104

Boost предоставляет тестовый пример (связанный с boost_regex):

// test.cpp
#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

Мой собственный CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

project(test)

set(CMAKE_BUILD_TYPE Release)

set(BOOST_ROOT "D:/test/boost_1_47_0")
set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}")
set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/stage/lib")

INCLUDE_DIRECTORIES (${BOOST_INCLUDE_DIRS})
LINK_DIRECTORIES( ${BOOST_LIBRARY_DIRS} )

set(testlib_src test.cpp)
add_library(testlib SHARED ${testlib_src})

target_link_libraries(testlib boost_regex-vc100-mt-1_47)

Сборка (32 бит)

  1. Исходный путь:

cwd: D:\test\test\test.cpp

 D:\test\test\CMakeList.txt

 D:\test\test\build
  1. Путь повышения:

D:\test\boost_1_47_0\

Построен

bootstrap.bat

.\b2 --build-type=complete variant=release link=shared runtime-link=shared stage
  1. ОС: win10

Настройка: cmake 3.24 + vs 2010 + nmake

cd build

cmake .. -G "Visual Studio 10" -G "NMake Makefiles"

nmake
  1. Ошибка:

fatal error LNK1104: cannot open file 'libboost_regex-vc100-mt-1_47.lib'

  1. Исправить

Файл с именем boost_regex-vc100-mt-1_47.lib существует в каталоге stage/lib, но без префикса lib.

Является ли отсутствующий префикс lib причиной ошибки ссылки?

Более того, я пробовал как 64-битную, так и 32-битную сборку, и обе оказались неудачными.

Префикс библиотеки Google cmake

n. m. could be an AI 20.06.2024 05:37

Поскольку Boost не настроен CMake, могу ли я изменить его соглашение об именах? Используете b2 или что-то еще? Я уже пробовал Boost в Linux, и все в порядке. Но я обнаружил, что для Windows CMake ведет себя по-другому с префиксом и суффиксом lib.

Rosssssss 20.06.2024 06:00

Я понятия не имею и в любом случае не рекомендую этого делать. В Windows имена библиотек обычно не начинаются с lib.

n. m. could be an AI 20.06.2024 07:54

Есть ли какие-то конкретные причины, по которым вы хотите добиться успеха тринадцатилетней давности?

Botje 20.06.2024 08:43

Да, мне нужно протестировать свой случай, используя академический код, построенный на очень старой цепочке инструментов. На данный момент у меня нет других хороших вариантов.

Rosssssss 20.06.2024 09:27

@Botje, предположительно, потому что они используют компилятор 14-летней давности.

Alan Birtles 20.06.2024 09:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Префикс lib используется для статических библиотек, вы создали только общие https://www.boost.org/doc/libs/1_47_0/more/getting_started/windows.html#library-naming. Вам необходимо определить BOOST_ALL_DYN_LINK, чтобы переключить автоматическое связывание для использования общих библиотек.

Вам следует использовать https://cmake.org/cmake/help/latest/module/FindBoost.html и ссылку на сгенерированные цели, что проще и надежнее, чем вручную указывать включения и библиотеки:

cmake_minimum_required(VERSION 2.6)

project(test)

set(CMAKE_BUILD_TYPE Release)

set(BOOST_ROOT "D:/test/boost_1_47_0")
find_package(Boost 1.47 REQUIRED COMPONENTS
             regex)
set(testlib_src test.cpp)
add_library(testlib SHARED ${testlib_src})

target_link_libraries(testlib Boost::regex)

Привет! Как вы заметили, отсутствующий префикс lib в моем предыдущем бусте указывает на динамическую сборку. Означает ли это, что ссылка по умолчанию CMake или Visual Studio 2010 является статической, а не динамической? Вот почему моя библиотека не смогла найти зависимость. Я только что изменил настройку сборки boost на link=static,shared и нашел файлы boost_xxx.dll и libboost_xxx.lib, которые соответствуют вашему комментарию.

Rosssssss 20.06.2024 09:38

Ничего общего с cmake или Visual Studio, это ускоряет автоматическое связывание по умолчанию со статическими библиотеками. Если вы правильно используете cmake, он автоматически все настроит за вас.

Alan Birtles 20.06.2024 09:41

Другие вопросы по теме