我正在开发64位的Visual Studio 2008 c#,我想使用一个使用boost的库。所以我用c++/CLI写了一个包装器。我设法将错误定位到
#include <boost/thread/mutex.hpp>.
如果我在我的c++/CLI包装器中包含任何文件,它本身包含<boost/thread/mutex.hpp>
,或者如果我直接将它包含在包装器中,我将得到一个"System. conf"。AccessViolationException" "试图读写受保护的内存。"这通常表明其他内存已损坏。"
我非常小心地为64位构建一切,所以我怀疑问题是存在的。当我在"普通"c++中使用64位的相同库时,一切都很好。我来了几个帖子,人们似乎有类似的问题与提升线程,但没有一个我发现的解决方案工作。有人知道吗?
问题在于。线程使用一些#pragma section
指令,这些指令在不使用/clr构建时是不兼容的,然后静态链接到使用/clr的代码。
我听说重建提升。线程与/clr(即,通过cxxflags="/clr"
时调用bjam)修复了这个问题,但我没有亲自尝试过。
我假设动态链接到boost。线程(而不是静态的,这是vc++的默认值;#define BOOST_THREAD_DYN_LINK
之前包括任何boost头)也应该工作,但再次,我还没有尝试过。
如果这不起作用,试试谷歌boost
thread
clr
tls
;你应该在boost邮件列表中找到很多关于它的帖子,因为这是一个旧的问题。
EDIT:正如Raman Sharma(微软高级项目经理)在这里评论的那样,甚至std::mutex
也不支持/clr,所以这一点也不奇怪。线程的互斥锁实现也不是。
正如另一个答案所说,boost在tss_pe.cpp中的pragmas与CLR不兼容。对该文件的简单修改修复了这个问题,并允许静态链接。我对Boost 1.44的修改版本在这里(与所做的更改不同)。
某些Boost库不能与c++ CLI代码静态链接,否则编译器可能会为某些Windows版本生成不兼容的映像。就我而言,在windows 10下使用vc++ 2017静态构建Boost 1.64 x86线程库时,我很难弄清楚这个问题。二进制文件在Windows 10下运行良好,但引发了系统。Windows 7下的badmageformatexception 。这个问题位于Boost线程库中,我最初将其静态链接到我的c++ CLI程序集。
下面是一个很容易重现问题的简短代码:
testcli.h - c++ CLI assembly FAILURE code
#pragma comment(lib, "libboost_thread-vc141-mt-1_64.lib") // static link makes the program crash under W7
namespace testcli
{
public ref class TestClass { public: static void Test(){} };
}
Program.cs - c#客户端代码加载'testcli'
using testcli;
namespace Cli
{
class Program { static void Main(string[] args) { new TestClass(); } } // instanciate C++ CLI Boost class
}
上面的代码通过引发System返回。BadImageFormatException(异常可以在应用程序事件查看器中找到)。
如果testcli被修改,使得Boost线程库现在是动态链接的:
testcli.h - c++ CLI汇编成功代码
#pragma comment(lib, "boost_thread-vc141-mt-1_64.lib") // dynamic link works fine under any Windows
namespace testcli
{
public ref class TestClass { public: static void Test(){} };
}
代码现在成功返回。
请注意,您可以定义BOOST_THREAD_DYN_LINK而不是BOOST_ALL_DYN_LINK,如下所示:http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html
这样做,你就不必把所有的Boost动态库打包到你的应用程序中。