Boost.python—Python与C++混合编程 踩坑记录,希望有越来越多的人分享

环境:vs2022+cmake+python3.9.7

fatal error LNK1104: 无法打开文件“libboost_python310-vc143-mt-gd-x64-1_83.lib”

如果安装了多个版本的python,要注意安装boost的时候默认安装的是系统环境变量中的python版本,也就是说boost.python也是有python版本的,要使用对应版本的python搭配对应版本的boost.python,否则会报错解决办法:

CMakeLists.txt中

set(PYTHON_LIBRARY "D:/anaconda3/libs/python39.lib")
find_package(PythonLibs 3.9 REQUIRED)

导入库

link_directories(${Boost_LIBRARIE})

或者

target_link_libraries(Data ${Boost_LIBRARIES})  # Link the library to my target Data

导入头文件同理

include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
 

C++中回调函数在Python中执行

这个问题可能与Python的全局解释器锁(GIL)有关。GIL是CPython解释器的一个机制,它阻止多个原生线程并行执行Python字节代码。这意味着即便在多线程环境中,每次也只有一个线程在执行。

当你在Python中调用time.sleep()时,当前线程会被阻塞,但是GIL会被释放,允许其他线程执行。如果回调函数是由其他线程触发的,并且该线程试图获取GIL来执行Python代码,它可能会在time.sleep()期间被阻塞,直到time.sleep()完成并释放GIL。

这可能解释了为什么在Python中time.sleep()期间没有输出,而在C++中Sleep(INFINITE)不会阻塞回调。

还需要特别注意的就是需要刷新控制台输出缓存:

printf

  1. 来自C语言:是C语言中的标准I/O函数,包含在<stdio.h>(在C++中为<cstdio>)头文件中。
  2. 格式化字符串printf使用格式化字符串,可以方便地输出不同类型的变量。
  3. 性能:通常printf的性能略高于cout,尤其是在大量输出时。
  4. 不安全:由于printf依赖于格式化字符串,如果格式化字符串与提供的变量类型不匹配,它可能会导致未定义的行为。

cout

  1. 来自C++语言:是C++中的标准输出流对象,包含在<iostream>头文件中。
  2. 类型安全cout是类型安全的,不会因为类型不匹配而导致未定义的行为。
  3. 可扩展性cout可以很容易地重载操作符,以支持自定义类型的输出。
  4. 流操作符:使用流操作符<<来连接不同类型的输出对象。

对于printf来说,如果要实现类似std::flush的效果,你可以使用\n来刷新缓冲区,或者调用fflush(stdout)来强制刷新缓冲区。

对于cout,你可以使用std::endlstd::flush来刷新缓冲区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值