boost互斥锁c++ /CLI问题



我正在开发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动态库打包到你的应用程序中。

最新更新