使用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
相关产品推荐
相关产品推荐

