首页 > 解决方案 > mingw/msys2 构建并链接到没有版本号的 dll

问题描述

我正在使用 mingw/msys2 构建 pjsip,它会在它们之后(.dll.2 文件)以及 .dll 文件继续使用 .2 构建 dll。如果我删除已构建的 .dll.2 文件并尝试构建我的程序,我的程序仍将链接到 .dll.2 版本并抱怨它们不存在。

我运行以构建 pjsip 的命令:

    ./configure CFLAGS="${MAKEFLAGS}" CXXFLAGS="${MAKEFLAGS}" \
            --build=${MINGW_CHOST} \
            --host=${MINGW_CHOST} \
            --target=${MINGW_CHOST} \
            --prefix="${OUT_PREFIX}" \
            --disable-openh264 \
            --disable-v4l2 \
            --disable-ffmpeg \
            --enable-libsamplerate \
            --disable-video \
            --enable-shared \
            --disable-static \
            --disable-libyuv \
            --with-external-speex \
            --with-gnutls

我可以在构建输出中看到它构建 dll.2 然后链接它们

ln -sf libpjsua2.dll.2 ../lib/libpjsua2.dll

如何使我的程序仅依赖于 .dll 而不是 .dll.2?

标签: dllmingwmsys2

解决方案


您将不得不(grep也许)浏览 Makefile.am 文件,找到 libpjsua2 的规则,并对其进行修改以删除 .2“扩展名”。我的猜测是 lib 扩展名和整数“扩展名”不会被硬编码,所以只需搜索 libpjsua2。此时您也可以移除该ln -sf位。您对任何文件所做的任何更改都应保存到diff源/构建目录之外的副本(或者,您可以),以便在您再次下载并解压缩源时可以重新应用更改。

您遇到此问题的原因是,在链接时,符号链接被解析并使用库的实际名称。再多的删除库也不会改变这一点。仅根据您提供的信息,您似乎可能误解了实际构建的内容:libpjsua2.dll 本身并不是一个库,而是指向 libpjsua2.dll.2 的链接。当您删除 libpjsua2.dll.2 时,您正在删除实际的库,libpjsua2.dll 没有指向任何地方,最终会出现“未找到”错误。


推荐阅读