• 总结C# 调用c++ 开源代码使用问题


    有些库是在vs环境中即可编译 ,

    有些是用cmake 编译.

    cmake 的方式

    https://cmake.org/download/

    当然编译前要有,lib那些链接包的安装 包管理下载软件vcpkg .

    https://github.com/Microsoft/vcpkg#quick-start

    such as

    cd <path to vcpkg>
    .\vcpkg.exe install gperf:x64-windows gperf:x86-windows openssl:x64-windows openssl:x86-windows zlib:x64-windows zlib:x86-windows

    cmake 生成dll时 ,要链接这些库

    比如 32位  64位 

    mkdir build
    cd build
    cmake -A Win32 -DTD_ENABLE_DOTNET=ON -DCMAKE_TOOLCHAIN_FILE=<path to vcpkg>/scripts/buildsystems/vcpkg.cmake ../../..
    cmake --build . --config Release
    cmake --build . --config Debug
    cd ..
    mkdir build64
    cd build64
    cmake -A x64 -DTD_ENABLE_DOTNET=ON -DCMAKE_TOOLCHAIN_FILE=<path to vcpkg>/scripts/buildsystems/vcpkg.cmake ../../..
    cmake --build . --config Release
    cmake --build . --config Debug

    最终想要的dll就生成了

    对于 32位 64位dll 以及缺相关依赖问题 文章在下

    dll文件32位64位检测工具以及Windows文件夹SysWow64的坑 

    监测dll 中依赖 的dll

    http://www.dependencywalker.com/

    微软工具包

    https://docs.microsoft.com/zh-cn/sysinternals/

    查看运行的应用程序引入的dll .

    https://docs.microsoft.com/zh-cn/sysinternals/downloads/listdlls

    最新的vc++运行库

    https://docs.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-160

    总结就是, vc++ 程序运行也跟c#一样有运行库.如果没有安装,则会出现明明有那个dll 还跳窗提示缺少依赖, 那是因为dll内程序也是依赖其他dll.

    我总结这个其他dll 64位程序用的dll是在system32, 32位程序用的是C:\Windows\SysWOW64 .至于 为何这样上边  dll文件32位64位检测工具以及Windows文件夹SysWow64的坑 已经解释了

    我还推测,运行库会根据不同的系统,把库dll 安装到 system32 和SysWOW64  , 中间dll 也是不同的系统不同版本号. 不同的vs 开发的程序需要不同的运行库,比如vs2019运行库  用不了vs2015的

    所以需要更新 c++运行库.经过实际测试,vs2019开发的带c++ dll的, 放在只安装了vs2015  Microsoft Visual C++ Redistributable packages  pc上会提示dll缺失,或依赖找不到.安装了最新的2015-2022 问题解决.

    所以一般来说,安装完运行库,再运行应用一般不会有问题.

    但也有不规范操作的例外.比如有些挺意外的情况,没在意debug 和release 下编译的 dll文件名 不同问题,碰到编译之后 比如lib1.dll ,debug下是libd1.dll . 同时 dll 引用内的dll 有个别也是d在文件名中.

    如果此时吧debug 跟往常一样跟release一样用,那是会报错的,在不知以上原因的情况下,会让你怀疑人生.

    于是把debug下的程序 ,放在客户机上无开发环境的 小白机上,是肯定会提示缺少依赖的

    至于开发机上为何可以,跟开发环境 有关,比如上边的这是个 c++dll调用返回消息的, 开发机的system 内有 此文件,客户机内是没有带文件名末尾d 的dll.

    技术交流qq群:143280841
  • 相关阅读:
    day49 前端之 jQery
    day48 BOM DOM jQuery
    如何用命令将本地项目上传到git---转
    jenkins邮件通知
    shell文件管理jenkins构建过程---window环境下报错:找不到shell文件
    【转】adb shell am instrument 命令详解
    INSTRUMENTATION_STATUS_CODE: -1,Error=Unable to find instrumentation info for
    Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
    【转】Java基础知识总结
    查看apk包名和Activity的方法
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/15665457.html
Copyright © 2020-2023  润新知