环境: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
来刷新缓冲区