首页 > 编程语言 >.NET Core|--调用C++库|--LibraryImport docker环境下,处理依赖问题--GCC--Docker

.NET Core|--调用C++库|--LibraryImport docker环境下,处理依赖问题--GCC--Docker

时间:2023-09-27 17:48:59浏览次数:37  
标签:GLIBCXX Core GCC -- libstd c++ 3.4 so.6

前言

万恶之源在于, C#程序中需要调用C++的一个函数库,
在Windows环境下, 只要保证引用的相关dll存在, 就是ok的,

但是在Linux环境下, 并且我的Webapi程序是部署在docker中的,
问题就比较麻烦一些.

经历了

新建软链接,
缺失".so"文件,
有了".so"文件后, 版本错误 : libstdc++.so.6: version `GLIBCXX_3.4.29' not found,

环境信息


#SkiaSharp - 版本
2.88.3

#SkiaSharp.NativeAssets.Linux.NoDependencies - 版本
2.88.3

#部署服务器环境 
Linux / docker / 

#Visual Studio 版本
Microsoft Visual Studio Professional 2022 (64 位)

#C#语言版本
10.0

解决方案


1.先下载一个gcc11的docker镜像( gcc版本按需来下载 )
2.根据gcc11的镜像, 跑起来一个docker容器, 我们称这个容器为"GccNet"
3.在此gcc11的容器中, 安装.net core的SDK,
4.将此"GccNet"容器, 打包为一个镜像"GccNet_Image"
5.以此镜像为基础, 跑起来一个容器即可

#Dockerfile内容如下

# 这个镜像里面既有gcc , 还有.net core环境
FROM GccNet_Image

EXPOSE 80

#环境端口
EXPOSE 5500

WORKDIR /app
COPY . /app

ENTRYPOINT ["dotnet", "WebApi.dll"]

总结

我刚开始的思路就是, 在.Net Core的基础上安装gcc那一套,( 因为调用的那个C++函数库需要用到gcc)
所以路走的很曲折, 各种问题,
后来和同事一起讨论下, 试了下这个方案,
先搞一个gcc的容器, 然后在这个容器里安装.net core的环境,
最终可以了...

附录--软链接

将.so文件放到指定目录之下后, 还是报错,
问了下同事, 是需要软连接

#具体用法是 "ln  -s   [源文件]   [软链接文件]"
ln -s libabc.so.3.3.3 libabc.so

#查看
 #ls -l

#修改软链接
#ln –snf [新的源文件或目录] [软链接文件]
 
#删除软链接
#rm –rf   ./软链接名称
#rm -rf ./软链接名称/ (这样就会把软链接以及软链接指向下的内容删除)
 
#正确的删除方式(删除软链接,但不删除实际数据)
rm -rf  ./libabc.so

附录--环境变量

在执行ldd libabc.so的时候, 发现很多明明存在这个目录下的so文件, "not found",
黄色警告...

后来看了下路径, 发现是需要更改一下环境变量


export LD_LIBRARY_PATH=/app/runtimes/linux-x64/native/


附录--缺少"libgomp.so.1"

#网络上关于这个问题搜索到了很多, 结果直接使用apt-get安装了一下就行了

#如果不更新一下的话,可能会提示失败 : Unable to lcate package libgomp1...
apt-get update

apt-get install libgomp1

刚开始我是进入容器中执行了这个命令,
这就会导致一个问题, 每次重新发布容器的时候, 都需要再重新apt-get一下该包,

然后我就直接在服务器上, 进行这个操作了,

温馨提示 : 如果觉得国外镜像实在慢的, 可以更换镜像为国内的...

#在服务器上执行, 巧了, 我的服务器上还没有apt-get, 服务器上使用了yum命令...

yum install libgomp1
yum

附录--libstdc++.so.6: version `GLIBCXX_3.4.29' not found

#报错信息
./libabc.so: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./libabc.so)

#切换目录到错误目录下
 cd /usr/lib/x86_64-linux-gnu/


 strings libstdc++.so.6 | grep GLIBCXX

#如果strings命令没有的话, 需要安装一下, 
# apt-get install binutils

root@abc:/usr/lib/x86_64-linux-gnu# strings libstdc++.so.6 | grep GLIBCXX_3.4.2
GLIBCXX_3.4.2
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28

#会发现, 确实没有"GLIBCXX_3.4.29"

#升级一下
apt-get install --only-upgrade libstdc++6

#输出内容↓ -- 提示我已经是最新版本 ...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libstdc++6 is already the newest version (10.2.1-6).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

#如果不出意外的话, 这就是最后一个问题了吧? -- 这不是最后一个问题...

#在网络上下载了一个29版本的文件, "libstdc++.so.6.0.29"

#删除libstdc++原来的软链接 -- libstdc++.so.6 -> libstdc++.so.6.0.28
rm -rf /usr/lib/x86_64-linux-gnu/libstdc++.so.6

#将下载的版本复制到指定目录下
cp libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29

#ln -s [源文件] [链接文件]
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

#查看libstdc++的文件和软链接
ls -n /usr/lib/x86_64-linux-gnu/ | grep libstdc

9ce0598796b266bed90bd8b10ead0a7e.png

docker 容器中安装gcc 11以上的版本


更换apt-get镜像源

#进入Docker容器内查看镜像debian版本
cat /etc/debian_version

#我使用中科大的镜像源作为替换
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

#查看源
 cat /etc/apt/sources.list
#还有一种方式更换镜像源
tee /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb http://mirrors.aliyun.com/debian-security stretch/updates main
deb-src http://mirrors.aliyun.com/debian-security stretch/updates main
deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib
EOF

tee /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe
EOF

附录--将libstdc++.so.6升级到libstdc++.so.6.0.29

#a.下载到文件, libstdc++.so.6.0.29

#b.将下载到的文件拷贝到指定的目录下, 比如"/usr/lib/x86_64-linux-gnu"

#c.切换目录
cd /usr/lib/x86_64-linux-gnu

#d. 备份一下( 有备无患 )
mv ./libstdc++.so.6.0.29 ./libstdc++.so.6.0.bak

#e. 软链接
ln -s libstdc++.so.6.29 libstdc++.so.6

#f. 查看是否软链接建立成功
ls -l libstdc++.so.6

附录--辅助命令 -- strings

#安装strings -- docker环境中默认是没有的

apt-get install binutils

辅助命令 -- ldd

ldd libabc.so

辅助命令 -- find

#查找["libstdc++.so.6.0.29"等...]
find / -name "libstdc++.so.6.0*"

辅助命令 -- ls -lh

ls -lh libstdc++.so.6.0.29
-rw-r--r-- 1 root root 2.1M Aug 17 09:39 libstdc++.so.6.0.29

杂言碎语

#有的时候, 执行的命令有了, 但是你不知道去哪里执行...


摘抄文档

标签:GLIBCXX,Core,GCC,--,libstd,c++,3.4,so.6
From: https://www.cnblogs.com/love-zf/p/17733248.html

相关文章

  • 2023年台州市初赛Misc
    2023年台州市初赛Misc这是神马冰蝎流量,找到key<?php@error_reporting(0);session_start();$key="144a6b2296333602";$_SESSION['k']=$key;session_write_close();$post=file_get_contents("php://input");i......
  • 批量将 html文件转成PDF文件
    再不会用openai就等被淘汰吧要批量将HTML文件转换为PDF文件,你可以使用一些可以自动化这个过程的工具或编程语言库。以下是一种可能的方法,使用Python编程语言和一个名为pdfkit的库,以及一个名为wkhtmltopdf的命令行工具,它可以将HTML转换为PDF。请按照以下步骤操作:安装必要的工......
  • Redis可视化工具:Another Redis Desktop Manager
    Redis可视化工具:AnotherRedisDesktopManager一、介绍AnotherRedisDesktopManager(简称:RedisDesktopManager或RDM)是一个Redis数据库的可视化管理工具。它是一个跨平台的桌面应用程序,能够让用户更轻松地与Redis进行交互和管理。更快、更好、更稳定的Redis桌面(GUI)管理客户......
  • Linux vi替换字符串
     1.基本的替换 :s/vivian/sky/替换当前行第一个vivian为sky :s/vivian/sky/g替换当前行所有vivian为sky :n,$s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky :n,$s/vivian/sky/g替换第n行开始到最后一行中每一行所有vivian为sky......
  • 赛事星平台的作答脚本Python实现(适用于刷时间)
    灵感来源:白嫖某文理的一次答题竞赛,前一百名有奖品正好缺个蓝牙耳机索性就刷个时间白嫖一波吧.咳咳,正式开始分享咯.准备工作:谷歌浏览器以及自带开发者工具页面分析:由于此次白嫖活动已经结束,就采用其他竞赛URL进行分析,原理相同.URL:https://saishi.cnki.net/MatchInde......
  • 「归档」AT 板刷
    我不好说。晚起的星星或许也是星星,哪怕它是被别人拿鞭子抽升起的。因为很菜,所以可能也会记录很多naive的题目。「ARC104C」想歪了,构造方案非常繁琐。考虑到题目只要求是否可行,所以思考可达性dp。如果给\(-1\)的空位填数就回到了构造方案的思路上,不妨转而考虑每个楼层的上......
  • 堆的原理以及实现O(lgn)
    大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。今天我们就来看看......
  • [转载] linux下 GCC编译链接静态库&动态库
    转载自:https://www.cnblogs.com/thechosenone95/p/10605172.html#_label0静态库有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后要讲到的environ变量)。......
  • python基础:模块和包
    一模块和包我们常常编辑保存的py文件就是一个个模块,模块名就是文件名不要后缀.py包是模块的集合,也可以将包看作一个目录,但该目录必须包含文件__init__.py(该文件可为空或有其它内容),python才会将该目录当作包来处理二模块和包的导入1模块的导入(1)导入形式1importmodule......
  • 业务安全情报23期 | 国庆前夕,又成功狙击一个倒卖机票的不法团伙
    中秋国庆临近,热门航线机票预定量暴增。顶象防御云业务安全情报中心,监测到一个不法团伙进行虚假占座攻击,倒卖热门航班机票。在顶象协助下,该航空公司有效阻截多日的攻击,保障乘客购票利益。 热门航班遭到“倒票”攻击今年中秋节、国庆节连休8天,国内热门城市机票预订量、酒店预......