在调试二进制文件中使用第三方库的发布版本是不好的做法吗?
我正在使用第三方库并编译了一个发行版.lib库.我的exe是在调试模式开发中.然后我得到了:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索,我发现这是因为我试图将发布与调试混合,我应该在调试模式下编译库,或者与_ITERATOR_DEBUG_LEVEL宏混淆.但我很好奇,如果这是推荐的方式和原因.我需要编译并保留我打算使用的每个第三方库的发布和调试二进制文件的记录,这很麻烦,这很快就会很多,而无意调试这些代码.
我想在Python脚本的共享库中调用我的C函数.传递指针时出现问题,64位地址似乎被截断为被调用函数内的32位地址.Python和我的库都是64位.
下面的示例代码演示了该问题.Python脚本打印传递给C函数的数据的地址.然后,从被调用的C函数内打印接收的地址.此外,C函数通过打印本地创建内存的大小和地址来证明它是64位.如果以任何其他方式使用指针,则结果是段错误.
的CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
add_library(plate MODULE plate.c)
Run Code Online (Sandbox Code Playgroud)
plate.c
#include <stdio.h>
#include <stdlib.h>
void plate(float *in, float *out, int cnt)
{
void *ptr = malloc(1024);
fprintf(stderr, "passed address: %p\n", in);
fprintf(stderr, "local pointer size: %lu\n local pointer address: %p\n", sizeof(void *), ptr);
free(ptr);
}
Run Code Online (Sandbox Code Playgroud)
test_plate.py
import numpy
import scipy
import ctypes
N = 3
x = numpy.ones(N, dtype=numpy.float32)
y = numpy.ones(N, dtype=numpy.float32)
plate = ctypes.cdll.LoadLibrary('libplate.so')
print 'passing address: %0x' % x.ctypes.data
plate.plate(x.ctypes.data, y.ctypes.data, ctypes.c_int(N))
Run Code Online (Sandbox Code Playgroud)
python-2.7的输出
在[1]中:运行../test_plate.py
传递地址:7f9a09b02320
传递地址:0x9b02320
本地指针大小:8 …