环境: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:
- 来自C语言:是C语言中的标准I/O函数,包含在
<stdio.h>(在C++中为<cstdio>)头文件中。 - 格式化字符串:
printf使用格式化字符串,可以方便地输出不同类型的变量。 - 性能:通常
printf的性能略高于cout,尤其是在大量输出时。 - 不安全:由于
printf依赖于格式化字符串,如果格式化字符串与提供的变量类型不匹配,它可能会导致未定义的行为。
cout:
- 来自C++语言:是C++中的标准输出流对象,包含在
<iostream>头文件中。 - 类型安全:
cout是类型安全的,不会因为类型不匹配而导致未定义的行为。 - 可扩展性:
cout可以很容易地重载操作符,以支持自定义类型的输出。 - 流操作符:使用流操作符
<<来连接不同类型的输出对象。
对于printf来说,如果要实现类似std::flush的效果,你可以使用\n来刷新缓冲区,或者调用fflush(stdout)来强制刷新缓冲区。
对于cout,你可以使用std::endl或std::flush来刷新缓冲区
博客围绕C++与Python开发展开。提到开发环境为vs2022+cmake+python3.9.7,解决了安装多版本Python时boost.python版本不匹配报错问题。还探讨了C++中回调函数在Python执行与GIL的关系,以及C和C++不同输出方式的特点与缓存刷新方法。
2396

被折叠的 条评论
为什么被折叠?



