Я успешно создал boost с помощью emscripten, используя следующие команды:
git clone --recursive https://github.com/boostorg/boost.git --branch 1.85.0
cd boost
./bootstrap.sh
source ~/emsdk/emsdk_env.sh
./b2 toolset=emscripten --with-graph --with-filesystem --with-program_options
Теперь я хотел бы, чтобы проект CMake использовал эту локальную сборку повышения. Что я делаю:
git clone https://.../cmakeproject.git cmakeproject
mkdir binaries
cd binaries
emcmake cmake -DBoost_DEBUG=1 -DBOOST_ROOT=/home/andy/boost ../cmakeproject
К сожалению, я получаю следующую ошибку:
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1673 ] _boost_TEST_VERSIONS = "1.77.0;1.77;...;1.33.0;1.33"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1674 ] Boost_USE_MULTITHREADED = "TRUE"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1675 ] Boost_USE_STATIC_LIBS = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1676 ] Boost_USE_STATIC_RUNTIME = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1677 ] Boost_ADDITIONAL_VERSIONS = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1678 ] Boost_NO_SYSTEM_PATHS = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1710 ] BOOST_ROOT = "/home/andy/boost"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1711 ] ENV{BOOST_ROOT} = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1712 ] BOOST_INCLUDEDIR = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1713 ] ENV{BOOST_INCLUDEDIR} = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1714 ] BOOST_LIBRARYDIR = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1715 ] ENV{BOOST_LIBRARYDIR} = <unset>
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1787 ] _boost_INCLUDE_SEARCH_DIRS = "/home/andy/boost/include;/home/andy/boost;PATHS;C:/boost/include;C:/boost;/sw/local/include"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1788 ] _boost_PATH_SUFFIXES = "boost-1_77_0;boost_1_77_0;...;boost/boost-1_33;boost/boost_1_33"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1873 ] Boost_LIB_PREFIX = ""
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1874 ] Boost_NAMESPACE = "boost"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:953 ] _boost_COMPILER = "-clang190" (guessed)
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1910 ] _boost_MULTITHREADED = "-mt"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1988 ] _boost_ARCHITECTURE_TAG = "" (detected)
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1992 ] _boost_RELEASE_ABI_TAG = "-"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:1993 ] _boost_DEBUG_ABI_TAG = "-d"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2053 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "/home/andy/boost/lib;/home/andy/boost/stage/lib;Boost_INCLUDE_DIR-NOTFOUND/lib;Boost_INCLUDE_DIR-NOTFOUND/../lib;Boost_INCLUDE_DIR-NOTFOUND/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2054 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "/home/andy/boost/lib;/home/andy/boost/stage/lib;Boost_INCLUDE_DIR-NOTFOUND/lib;Boost_INCLUDE_DIR-NOTFOUND/../lib;Boost_INCLUDE_DIR-NOTFOUND/stage/lib;PATHS;C:/boost/lib;C:/boost;/sw/local/lib"
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2239 ] Searching for FILESYSTEM_LIBRARY_RELEASE: boost_filesystem-clang190-mt-;boost_filesystem-clang190-mt;boost_filesystem-clang190-mt;boost_filesystem-mt-;boost_filesystem-mt;boost_filesystem-mt;boost_filesystem-mt;boost_filesystem
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2294 ] Searching for FILESYSTEM_LIBRARY_DEBUG: boost_filesystem-clang190-mt-d-;boost_filesystem-clang190-mt-d;boost_filesystem-clang190-mt-d;boost_filesystem-mt-d-;boost_filesystem-mt-d;boost_filesystem-mt-d;boost_filesystem-mt;boost_filesystem
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2239 ] Searching for GRAPH_LIBRARY_RELEASE: boost_graph-clang190-mt-;boost_graph-clang190-mt;boost_graph-clang190-mt;boost_graph-mt-;boost_graph-mt;boost_graph-mt;boost_graph-mt;boost_graph
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2294 ] Searching for GRAPH_LIBRARY_DEBUG: boost_graph-clang190-mt-d-;boost_graph-clang190-mt-d;boost_graph-clang190-mt-d;boost_graph-mt-d-;boost_graph-mt-d;boost_graph-mt-d;boost_graph-mt;boost_graph
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2239 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-clang190-mt-;boost_program_options-clang190-mt;boost_program_options-clang190-mt;boost_program_options-mt-;boost_program_options-mt;boost_program_options-mt;boost_program_options-mt;boost_program_options
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2294 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-clang190-mt-d-;boost_program_options-clang190-mt-d;boost_program_options-clang190-mt-d;boost_program_options-mt-d-;boost_program_options-mt-d;boost_program_options-mt-d;boost_program_options-mt;boost_program_options
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2239 ] Searching for SYSTEM_LIBRARY_RELEASE: boost_system-clang190-mt-;boost_system-clang190-mt;boost_system-clang190-mt;boost_system-mt-;boost_system-mt;boost_system-mt;boost_system-mt;boost_system
-- [ /usr/share/cmake-3.22/Modules/FindBoost.cmake:2294 ] Searching for SYSTEM_LIBRARY_DEBUG: boost_system-clang190-mt-d-;boost_system-clang190-mt-d;boost_system-clang190-mt-d;boost_system-mt-d-;boost_system-mt-d;boost_system-mt-d;boost_system-mt;boost_system
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Boost (missing: filesystem graph program_options system)
(found version "1.85.0")
Call Stack (most recent call first):
/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.22/Modules/FindBoost.cmake:2360 (find_package_handle_standard_args)
cmake/FindDependencies.cmake:7 (find_package)
CMakeLists.txt:99 (include)
Кажется, что процесс сборки не видит мои встроенные библиотеки. _boost_LIBRARY_SEARCH_DIRS_RELEASE
и _boost_LIBRARY_SEARCH_DIRS_DEBUG
выше имеют /home/andy/boost/stage/lib
в пути поиска библиотеки.
$ ls /home/andy/boost/stage/lib
cmake libboost_atomic.so.1.85.0 libboost_filesystem.so.1.85.0 libboost_graph.so.1.85.0 libboost_program_options.so.1.85.0 libboost_regex.so.1.85.0 libboost_system.so.1.85.0
libboost_atomic.a libboost_filesystem.a libboost_graph.a libboost_program_options.a libboost_regex.a libboost_system.a
libboost_atomic.so libboost_filesystem.so libboost_graph.so libboost_program_options.so libboost_regex.so libboost_system.so
Процесс сборки обнаруживает, что у меня собрана версия 1.85.0, предполагая, что каталог включения правильно прочитан (и, я полагаю, правильно проанализирован version.hpp).
Я собираю WSL, используя дистрибутив Ubuntu 22.04. На всякий случай я попробовал сборку с двух разных машин с нуля (новый дистрибутив Ubuntu WSL) и всегда получал один и тот же результат.
Насколько я понимаю, при запуске с помощью emcmake CMake ведет себя подозрительно: github.com/emscripten-core/emscripten/issues/…. Это может быть ошибка.
Я не вижу, как выглядят ваши CMakeLists, но мне удалось превратить мою предыдущую демонстрацию в такой проект CMake.
Идентичен предыдущей демонстрации, но без --with-graph
, поэтому собираются все библиотеки, включенные по умолчанию:
git clone --recursive https://github.com/boostorg/boost.git --branch boost-1.85.0 --depth=1 emboost --jobs=16
cd emboost
./bootstrap.sh
./b2 toolset=emscripten # --with-graph
Я не использую emcmake, я предпочитаю, чтобы CMake сам это делал по умолчанию:
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(test_build)
set(CMAKE_EXPORT_COMPILE_COMMANDS On)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwasm-exceptions")
set(Boost_USE_STATIC_LIBS On)
find_package(Boost 1.85.0 REQUIRED COMPONENTS graph)
add_executable(test_build.js main.cpp)
target_link_libraries(test_build.js Boost::graph)
Все параметры являются необязательными, за исключением Boost_USE_STATIC_LIBS
и -fwasm-exceptions
, которые, по-видимому, необходимы для работы ссылки.
С демо-программой без изменений:
main.cpp
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_utility.hpp>
#include <boost/graph/graphviz.hpp>
struct Vertex {
int id;
};
using G = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex>;
int main() {
G g;
boost::dynamic_properties dp;
dp.property("node_id", get(&Vertex::id, g));
std::istringstream dot(R"(digraph G {
0;
1;
2;
0 -> 1;
1 -> 2;
2 -> 0;
})");
read_graphviz(dot, g, dp);
print_graph(g, get(&Vertex::id, g));
}
У нас есть живая демо-версия:
export CXX=em++
export CC=emcc
export Boost_DIR=$PWD/../emboost/stage/lib/cmake
cmake -B build .
make -C build/
node ./build/test_build.js
Печать
0 --> 1
1 --> 2
2 --> 0
Доказательство того, что ссылка была использована, потому что read_graphviz_new.cpp
является объектом библиотеки.
Не могли бы вы уточнить, что вы имеете в виду под «Я не использую emcmake, я предпочитаю, чтобы CMake понял это по умолчанию»? Я использую emcmake, но не против использовать ваш подход без emcmake — если я его понимаю.
Я не могу объяснить лучше, чем то, что я сделал, с использованием точных утверждений. Это все есть.
Вы имеете в виду, что emcmake просто автоматически добавляет необходимые параметры CMAKE (в начало вашего CMakeLists.txt)? Я верю, что это именно то, что он делает, и если да, то я принимаю это. Спасибо.
Я не знаю, что делает emcmake. Я знаю, что требуется, и именно это показываю в ответе. Я полагаю, что самое важное — это настроить CXX и CC до того, как CMake настроит ваш проект. (Обратите внимание, я даже указал, какие параметры имеют значение, а какие я просто представляю себе разумный проект CMake, потому что вы его не предоставили :))
Верно;) Я действительно ценю ваши усилия.
В вашем ответе я не уточняю, где вы указываете своему CMakeLists.txt использовать вашу сборку boost. Как ваш CMakeLists.txt узнает, что ваша сборка ускорения находится в режиме «emboost»? Обновлено: Понятно, это переменная среды. И это Boost_DIR, а не BOOST_ROOT. Черт возьми, мне бы хотелось, чтобы при повышении было меньше переменных!
Здесь виноват не столько импульс, сколько модули CMake. И тот факт, что оно постоянно меняется. На самом деле вы видите признаки прогресса (поддержка CMake прямо в выпуске Boost!), однако я чувствую вашу боль: раздражает натыкаться на кирпичные стены каждый раз, когда он меняется. Я едва знаю основы, поэтому стараюсь придерживаться минимума, чтобы справиться :wry-smile:
Какой проект вы компилируете? CMake имеет значение. Использует ли он модули CMake или «старомодные» переменные подстановки FindPackage?