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)
cwd: D:\test\test\test.cpp
D:\test\test\CMakeList.txt
D:\test\test\build
D:\test\boost_1_47_0\
Построен
bootstrap.bat
.\b2 --build-type=complete variant=release link=shared runtime-link=shared stage
Настройка: cmake 3.24 + vs 2010 + nmake
cd build
cmake .. -G "Visual Studio 10" -G "NMake Makefiles"
nmake
fatal error LNK1104: cannot open file 'libboost_regex-vc100-mt-1_47.lib'
Файл с именем boost_regex-vc100-mt-1_47.lib существует в каталоге stage/lib, но без префикса lib.
Является ли отсутствующий префикс lib причиной ошибки ссылки?
Более того, я пробовал как 64-битную, так и 32-битную сборку, и обе оказались неудачными.
Поскольку Boost не настроен CMake, могу ли я изменить его соглашение об именах? Используете b2 или что-то еще? Я уже пробовал Boost в Linux, и все в порядке. Но я обнаружил, что для Windows CMake ведет себя по-другому с префиксом и суффиксом lib.
Я понятия не имею и в любом случае не рекомендую этого делать. В Windows имена библиотек обычно не начинаются с lib.
Есть ли какие-то конкретные причины, по которым вы хотите добиться успеха тринадцатилетней давности?
Да, мне нужно протестировать свой случай, используя академический код, построенный на очень старой цепочке инструментов. На данный момент у меня нет других хороших вариантов.
@Botje, предположительно, потому что они используют компилятор 14-летней давности.





Префикс 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, которые соответствуют вашему комментарию.
Ничего общего с cmake или Visual Studio, это ускоряет автоматическое связывание по умолчанию со статическими библиотеками. Если вы правильно используете cmake, он автоматически все настроит за вас.
Префикс библиотеки Google cmake