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

MSYS环境编译ElmerFEM遇链接错误:无法找到-ldl

在MSYS/MinGW环境编译ElmerFEM时的链接错误解决

我在Windows系统的MSYS环境下编译ElmerFEM项目,构建到56%时遭遇链接错误,具体为链接Fortran共享库msys-elmersolver.dll失败,完整错误信息如下:

[ 56%] Linking Fortran shared library msys-elmersolver.dll
cd "/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/fem/src" && /usr/bin/cmake.exe -E cmake_link_script CMakeFiles/elmersolver.dir/link.txt --verbose=1
/c/tools/msys64/mingw64/bin/gfortran.exe  -fallow-argument-mismatch -O2 -g -DNDEBUG -shared -Wl,--enable-auto-import -o msys-elmersolver.dll -Wl,--out-implib,libelmersolver.dll.a -Wl,--major-image-version,0,--minor-image-version,0 CMakeFiles/elmersolver.dir/AddrFunc.o CMakeFiles/elmersolver.dir/NavierStokes.o CMakeFiles/elmersolver.dir/NavierStokesGeneral.o CMakeFiles/elmersolver.dir/NavierStokesCylindrical.o CMakeFiles/elmersolver.dir/Lists.o CMakeFiles/elmersolver.dir/DiffuseConvectiveAnisotropic.o CMakeFiles/elmersolver.dir/LoadMod.o CMakeFiles/elmersolver.dir/DiffuseConvectiveGeneralAnisotropic.o CMakeFiles/elmersolver.dir/PElementMaps.o CMakeFiles/elmersolver.dir/PElementBase.o CMakeFiles/elmersolver.dir/ElementDescription.o CMakeFiles/elmersolver.dir/Integration.o CMakeFiles/elmersolver.dir/ListMatrixArray.o CMakeFiles/elmersolver.dir/ModelDescription.o CMakeFiles/elmersolver.dir/GeneralUtils.o CMakeFiles/elmersolver.dir/Stress.o CMakeFiles/elmersolver.dir/StressGeneral.o CMakeFiles/elmersolver.dir/LinearAlgebra.o CMakeFiles/elmersolver.dir/CoordinateSystems.o CMakeFiles/elmersolver.dir/ListMatrix.o CMakeFiles/elmersolver.dir/CRSMatrix.o CMakeFiles/elmersolver.dir/BandMatrix.o CMakeFiles/elmersolver.dir/BandwidthOptimize.o CMakeFiles/elmersolver.dir/BlockSolve.o CMakeFiles/elmersolver.dir/MaterialModels.o CMakeFiles/elmersolver.dir/DirectSolve.o CMakeFiles/elmersolver.dir/IterSolve.o CMakeFiles/elmersolver.dir/IterativeMethods.o CMakeFiles/elmersolver.dir/TimeIntegrate.o CMakeFiles/elmersolver.dir/Types.o CMakeFiles/elmersolver.dir/SolveBand.o CMakeFiles/elmersolver.dir/ElementUtils.o CMakeFiles/elmersolver.dir/Radiation.o CMakeFiles/elmersolver.dir/fft.o CMakeFiles/elmersolver.dir/Load.o CMakeFiles/elmersolver.dir/Differentials.o CMakeFiles/elmersolver.dir/FreeSurface.o CMakeFiles/elmersolver.dir/Walls.o CMakeFiles/elmersolver.dir/SolverUtils.o CMakeFiles/elmersolver.dir/SolveSBand.o CMakeFiles/elmersolver.dir/CPUTime.o CMakeFiles/elmersolver.dir/Interpolation.o CMakeFiles/elmersolver.dir/MainUtils.o CMakeFiles/elmersolver.dir/Adaptive.o CMakeFiles/elmersolver.dir/EigenSolve.o CMakeFiles/elmersolver.dir/HashTable.o CMakeFiles/elmersolver.dir/MeshUtils.o CMakeFiles/elmersolver.dir/SaveUtils.o CMakeFiles/elmersolver.dir/SParIterGlobals.o CMakeFiles/elmersolver.dir/SParIterComm.o CMakeFiles/elmersolver.dir/SParIterPrecond.o CMakeFiles/elmersolver.dir/SParIterSolver.o CMakeFiles/elmersolver.dir/Messages.o CMakeFiles/elmersolver.dir/Multigrid.o CMakeFiles/elmersolver.dir/Smoothers.o CMakeFiles/elmersolver.dir/ClusteringMethods.o CMakeFiles/elmersolver.dir/ParallelUtils.o CMakeFiles/elmersolver.dir/ParallelEigenSolve.o CMakeFiles/elmersolver.dir/solve_cmplx.o CMakeFiles/elmersolver.dir/solve_real.o CMakeFiles/elmersolver.dir/MGPrec.o CMakeFiles/elmersolver.dir/DefUtils.o CMakeFiles/elmersolver.dir/MeshPartition.o CMakeFiles/elmersolver.dir/MeshRemeshing.o CMakeFiles/elmersolver.dir/RadiationFactors.o CMakeFiles/elmersolver.dir/f_stubs.o CMakeFiles/elmersolver.dir/ExchangeCorrelations.o CMakeFiles/elmersolver.dir/SolveHypre.o CMakeFiles/elmersolver.dir/amgx.o CMakeFiles/elmersolver.dir/SolverActivate_x.o CMakeFiles/elmersolver.dir/SolveTrilinos.o CMakeFiles/elmersolver.dir/SolveSuperLU.o CMakeFiles/elmersolver.dir/umf4_f77wrapper.o CMakeFiles/elmersolver.dir/VankaCreate.o CMakeFiles/elmersolver.dir/ParticleUtils.o CMakeFiles/elmersolver.dir/Feti.o CMakeFiles/elmersolver.dir/cholmod.o CMakeFiles/elmersolver.dir/InterpolateMeshToMesh.o CMakeFiles/elmersolver.dir/InterpVarToVar.o CMakeFiles/elmersolver.dir/LinearForms.o CMakeFiles/elmersolver.dir/H1Basis.o CMakeFiles/elmersolver.dir/CircuitUtils.o CMakeFiles/elmersolver.dir/BackwardError.o CMakeFiles/elmersolver.dir/ElmerSolver.o CMakeFiles/elmersolver.dir/MagnetoDynamicsUtils.o CMakeFiles/elmersolver.dir/ComponentUtils.o CMakeFiles/elmersolver.dir/ZirkaHysteresis.o CMakeFiles/elmersolver.dir/SolidMechanicsUtils.o CMakeFiles/elmersolver.dir/MatrixAssembly.o CMakeFiles/elmersolver.dir/OptimizationUtils.o CMakeFiles/elmersolver.dir/MeshGenerate.o CMakeFiles/elmersolver.dir/Lua.o   -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/fem/src"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/matc/src"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/umfpack/src/umfpack"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/umfpack/src/amd"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/fhutiter/src"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/fem/src/binio"  -L"/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build/mathlibs/src/arpack"  libmpi_stubs.dll.a ../../matc/src/libmatc.dll.a ../../umfpack/src/umfpack/libumfpack.a ../../umfpack/src/amd/libamd.a ../../fhutiter/src/libfhuti.dll.a binio/libbinio.a ../../mathlibs/src/arpack/libarpack.dll.a /mingw64/lib/libopenblas.dll.a /mingw64/lib/libopenblas.dll.a /mingw64/lib/libopenblas.dll.a -ldl -lm -lstdc++
C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -ldl: No such file or directory
collect2.exe: error: ld returned 1 exit status
make[2]: *** [fem/src/CMakeFiles/elmersolver.dir/build.make:1484: fem/src/msys-elmersolver.dll] Error 1
make[2]: Leaving directory '/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build'
make[1]: *** [CMakeFiles/Makefile2:16950: fem/src/CMakeFiles/elmersolver.dir/all] Error 2
make[1]: Leaving directory '/c/Users/foo/OneDrive - bar/Desktop/Elmer/elmerfem/build'
make: *** [Makefile:169: all] Error 2

我曾尝试通过CMake显式设置链接器:set(CMAKE_LINKER "/c/tools/msys64/mingw64/bin/ld.exe"),但未解决问题。当前使用的是ElmerFEM的wip/windows分支,希望找到能在MSYS/MinGW环境下正确引入libdl库,或移除-ldl链接标志且保持兼容性的解决方案。


解决方法

方案一:移除Windows平台下的-ldl链接依赖

MinGW环境中,动态链接库的加载功能已集成到系统核心库,不需要额外链接libdl。找到项目CMake配置中添加-ldl的位置,添加平台判断逻辑:

# 针对目标库添加链接依赖时
if(NOT WIN32)
    target_link_libraries(elmersolver PRIVATE dl)
endif()

# 如果是全局添加链接标志时
if(NOT WIN32)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ldl")
endif()

修改后重新运行cmake ..和make即可。

方案二:安装MSYS2提供的libdl替代包

在MSYS2的MinGW64终端中执行以下命令安装libdl包:

pacman -S mingw-w64-x86_64-libdl

安装完成后重新配置并编译项目,链接器就能找到-ldl对应的库文件。

方案三:完善项目的跨平台CMake配置

检查项目根目录或子模块的CMakeLists.txt,确认是否遗漏了Windows平台的链接库适配。如果是项目本身的配置问题,可以提交补丁添加上述平台判断逻辑,确保项目在Windows和类Unix平台下都能正常编译。


内容的提问来源于stack exchange,提问作者Foad S. Farimani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:54:56