那些年踩过的坑

mingw库在VS下的使用

LDFLAGS += -static-libgcc -static-libstdc++
LDFLAGS += -Wl,-Bstatic -lstdc++ -lpthread
LDFLAGS += -Wl,--out-implib,xxx.lib,--output-def,xxx.def
$(CXX) $(CXXFLAGS) $^ -o $@.dll $(LDFLAGS)

通过上述Makefile可以在mingw下生成dll和对应的lib、def文件,且没有任何mingw库的依赖;
单独在VS下链接运行也是OK的,但一旦和其它mingw编译的库同时使用,链接时没问题,运行时却会跳出无法定位函数的错误提示框;

无法定位程序输入点

解决方案:
使用windows命令行下的lib命令,根据def文件重新导出lib文件,重新链接,运行正常;

lib /DEF:xxx.def /MACHINE:X86 /OUT:xxx.lib

具体导致原因未知,需要研究lib导入库原理,网上对其原理解释很少,《程序员的自我修养》动态库的导入、装载、运行一章中或可以找到答案;

gcc链接库顺序导致的undefined reference

gcc在链接过程中,对链接顺序是有要求的,库的加载顺序是从右往左的,也就是右边的库先加载,左边的库后加载,当然这是历史遗留导致,这样做一来是为了防止链接多余的库导致生成目标文件变大,二来是防止循环查找符号增加链接时间

以下面为例

gcc main.c -o main -llibx -lliby

链接器首先加载liby的符号表,然后加载libx,如果liby依赖于libx,则会出现undefined reference “libx func”的错误

所以在写Makefile时,链接库顺序很重要,一个原则是

-l上层库 -l底层库 -l系统库

如果实在搞不清楚各个库间的依赖关系怎么办,链接器提供了重复查找的选项"-(" -llibs "-)",在gcc选项中使用-Xlinker将其传入,整体写法如下:

gcc main.c -o main -Xlinker "-(" -llibx -liby "-)"

当然循环查找可能会增加链接时间,建议在依赖库都写上后如果出现undefined reference错误时,先使用-Xlinker先尝试下,如果使用-Xlinker后链接是OK的,那就可以判定是链接库顺序导致的,后续再搞清库依赖关系,不断调整链接顺序即可,如果不OK,则是还有依赖库未写上。

protobuf运行报错

terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)

gdb分析core文件,发现崩溃在call_once<std::once_flag&, void (&)()> () at ./google/protobuf/stubs/once.h:91
经分析,call_once是调用pthread_once实现,故链接库加上-lpthread,问题解决

grpc不支持多次异步写

grpc提供的异步接口并非真正的异步接口,只能有序读写,等待完成队列通知返回后才能进行下一次读写,同时多次读写会导致程序中断Abort,Write接口上注释如下:

    /// Only one write may be outstanding at any given time. This means that
    /// after calling Write, one must wait to receive \a tag from the completion
    /// queue BEFORE calling Write again.

https://blog.csdn.net/jq0123/article/details/71308179

Python的序列化和反序列化指的是将Python对象转换为可存储或可传输的格式,以及将这些格式转换回Python对象的过程。常用的序列化格式有JSON、pickle等。在进行序列化和反序列化的过程中,可能会遇到一些点,下面介绍一些常见的问题和解决方法。 1. JSON序列化和反序列化时,需要注意Python对象是否支持JSON格式。例如,datetime类型的对象无法直接转换为JSON格式,需要进行处理。 ```python import json from datetime import datetime # 序列化 json.dumps({'time': datetime.now()}) # 报错 # 处理后序列化 json.dumps({'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) ``` 2. pickle序列化和反序列化时,需要注意Python对象是否支持pickle格式。例如,lambda函数和内置函数无法被pickle。 ```python import pickle # 序列化 pickle.dumps(lambda x: x**2) # 报错 # 自定义函数后序列化 def my_function(x): return x**2 pickle.dumps(my_function) ``` 3. 在反序列化时,需要注意安全问题。反序列化可以执行任意代码,可能会导致安全问题。因此,应该只反序列化可信来源的数据。 ```python import pickle # 反序列化 data = b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x06print\x94\x93\x94\x8c\x05hello\x94\x85\x94.' pickle.loads(data) # 执行print('hello'),有安全风险 ``` 总之,在进行序列化和反序列化的过程中,需要注意Python对象是否支持序列化格式,以及安全问题。建议使用可信的序列化数据,并对反序列化数据进行审查和验证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值