我正在使用 VS2010 和 VS2012 项目的解决方案。
VS2010 项目调用 VS2012 中的函数,反之亦然。起初这很好用,但是当我还需要在两个项目之间共享变量时,我注意到变量似乎没有相同的内存对齐方式,并且每个项目对相同的内存地址的解释不同。
更新:它似乎只在使用STL-containers时发生,其他不包含 std:: 的结构和类工作正常。
为了说明这个问题,以下代码在不同的 Visual Studio 版本上运行时应该会产生不同的结果。
#include <string>
#include <vector>
int main()
{
int stringSize = sizeof(std::string); // Yelds 32 on VS2010, 28 on VS2012
int intVectorSize = sizeof(std::vector<int>); // Yelds 20 on VS2010, 16 on VS2012
return 0;
};
对我来说,将两个项目更新到相同的版本是不可能的,因为我有一些依赖于每个版本。
有谁知道解决方案或绕过问题的方法?
我会尽快将这两个项目升级到 VS2012 编译器,但现在我正在寻找一个快速而肮脏的解决方案,这样我就可以和工作相处了。由于它似乎只发生在 STL 容器中,是否有可能在所有项目中使用旧版本的库?还是有可能欺骗编译器?也许改变填充大小?
此外, std::vector 中的第一个元素似乎读得很好,只有向量中的后续元素似乎被打乱了。(见图。)
调试 2010 年和 2012 年编译的“main.cpp”中的“Fetched”变量的图像。
有人希望我澄清变量的共享方式。
我们正在 VS2012 编译模式下将第一个项目编译成 DLL,然后尝试在 VS2010 中访问该项目。
这是一些重现问题的代码。如果您想亲自尝试,可以在此处下载完整的 VS2012 解决方案。
这段代码使用 VS2012 编译成 DLL。
DLLExport.h
#ifdef DLLHELL_EX
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#include <vector>
#include <string>
class DLL_API Foo
{
public:
Foo();
~Foo();
std::vector<std::string>* exposedMember;
};
DLLExport.cpp
#include "DllExport.h"
Foo::Foo()
{
// Create member
exposedMember = new std::vector<std::string>();
// Fill member with juicy data
for(int i=0; i<5; i++)
exposedMember->push_back("Fishstick");
}
Foo::~Foo()
{
// Clean up behind ourselves like good lil' programmers
delete exposedMember;
}
此代码使用 DLL 并使用 VS2010 编译。
主文件
#include "DllExport.h"
int main()
{
// Creating class from DLL
Foo bar;
// Fetching "exposedMember" from class
std::vector<std::string>* member = bar.exposedMember;
return 0;
}
使用本教程创建了 DLL