You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MinGW-w64构建FMM工具时出现未定义引用错误

Windows下MSYS2构建FMM工具时的未定义引用错误求助

我尝试在Windows系统上构建快速地图匹配(FMM)工具,官方文档推荐使用Cygwin,但我选择了MSYS2,操作步骤如下:

  • 下载并安装Windows版本的Rtools42(需为FMM开发R包装器);
  • 通过Windows开始菜单启动Rtools42 bash shell;
  • 在shell中执行pacman -Syu更新MSYS2(若shell自动关闭则重新启动);
  • 执行pacman -S msys2-keyring避免签名无效和数据库损坏错误;
  • 执行命令pacman -Sy mingw-w64-x86_64-gcc mingw-w64-x86_64-openmp mingw-w64-x86_64-cmake mingw-w64-x86_64-gdal mingw-w64-x86_64-boost mingw-w64-x86_64-swig mingw-w64-x86_64-python mingw-w64-x86_64-make安装额外依赖;
  • 启动MinGW64 shell:C:\rtools42\mingw64.exe;
  • 创建并进入fmm目录:mkdir fmm && cd fmm;
  • 将FMM的Git仓库克隆到该目录:git clone https://github.com/cyang-kth/fmm.git .;
  • 修改fmm/CMakeLists.txt第30行:将set(CMAKE_CXX_STANDARD 11)改为set(CMAKE_CXX_STANDARD 14)(适配最新版本Boost的兼容性要求);
  • 在fmm目录下创建并进入build目录:mkdir build && cd build;
  • 使用cmake生成Makefile:cmake -G "MSYS Makefiles" ..;
  • 执行Makefile:mingw32-make -j8。

执行不带-j8参数的mingw32-make命令时,出现未定义引用错误,具体错误信息如下:

$ mingw32-make
-- CMAKE version 3.25.2
-- Set CMP0074 state to NEW
-- Set CMP0086 state to NEW
-- Set CMP0078 state to NEW
-- The C compiler identification is GNU 12.2.0
-- The CXX compiler identification is GNU 12.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/rtools42/mingw64/bin/cc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/rtools42/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
--
No conda environment found in PATH!
PATH=C:\rtools42\mingw64\bin;C:\rtools42\usr\local\bin;C:\rtools42\usr\bin;C:\rtools42\usr\bin;C:\Windows\System32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\progra~1\git\cmd;C:\rtools42\usr\bin\site_perl;C:\rtools42\usr\bin\vendor_perl;C:\rtools42\usr\bin\core_perl

-- Could NOT find Conda (missing: CONDA_PREFIX)
-- Non conda exist, search library in default path
-- GDAL headers found at C:/rtools42/mingw64/include
-- GDAL library found at C:/rtools42/mingw64/lib/libgdal.dll.a
-- Boost headers found at C:/rtools42/mingw64/include
-- Boost library found at Boost::serialization;Boost::exception
-- Boost library version 1_81
-- OpenMP_HEADERS found at
-- OpenMP_CXX_LIBRARIES found at C:/rtools42/mingw64/lib/libgomp.dll.a;C:/rtools42/mingw64/lib/libmingwthrd.a;C:/rtools42/mingw64/lib/libmingwthrd.a
-- Installation folder C:/Program Files (x86)/fmm
-- Not install fmm headers
-- Add python cmake information
-- Swig version is 4.1.1
-- Python header found at C:/rtools42/mingw64/include/python3.10
-- Python library found at C:/rtools42/mingw64/lib/libpython3.10.dll.a
<string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
<string>:1: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead
-- Python packages C:/rtools42/mingw64/lib/python3.10/site-packages
-- Using swig add library
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/ashir/Documents/testing/fmm/fmm/build
[  1%] Built target CORE
[  3%] Built target ALGORITHM
[  9%] Built target CONFIG
[ 13%] Built target IO
[ 15%] Built target UTIL
[ 23%] Built target NETWORK
[ 26%] Built target MM_OBJ
[ 40%] Built target FMM_OBJ
[ 46%] Built target STMATCH_OBJ
[ 76%] Built target H3_OBJ
[ 78%] Built target FMMLIB
[ 80%] Linking CXX executable fmm.exe
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0x26): undefined reference to `FMM::MM::FMMAppConfig::FMMAppConfig(int, char**)'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0x3c): undefined reference to `FMM::MM::FMMAppConfig::validate() const'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0x88): undefined reference to `FMM::NETWORK::Network::Network(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0x9b): undefined reference to `FMM::NETWORK::NetworkGraph::NetworkGraph(FMM::NETWORK::Network const&)'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0xba): undefined reference to `FMM::MM::UBODT::read_ubodt_file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0xc7): undefined reference to `FMM::MM::FMMApp::run()'
C:/rtools42/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/fmm.dir/objects.a(fmm.cpp.obj):fmm.cpp:(.text.startup+0xd9): undefined reference to `FMM::MM::FMMAppConfig::print_help()'
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [CMakeFiles/fmm.dir/build.make:108: fmm.exe] Error 1
mingw32-make[1]: *** [CMakeFiles/Makefile2:425: CMakeFiles/fmm.dir/all] Error 2
mingw32-make: *** [Makefile:136: all] Error 2

更新(2023-01-29)
在add_executable(fmm src/app/fmm.cpp)行之前,向CMakeLists.txt中添加message(STATUS ${FMMGlob})、message(STATUS "EMPTY_LINE")和message(STATUS ${NETWORK}),重新运行cmake和make后,cmake输出展示了相关文件路径,但make后错误依旧。

更新(2023-02-05)
修正为添加${NetworkGlob}而非${NETWORK}到CMakeLists.txt中,cmake输出显示了network相关文件路径,但make的输出未发生变化,错误仍存在。

请问该如何解决这个问题?

内容的提问来源于stack exchange,提问作者Ashirwad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:20:25