某些Boost庫不能與C++ CLI代碼靜態鏈接,否則編譯器可能會爲某些Windows版本生成不兼容的映像。 就我而言,當我在Windows 10下使用VC++ 2017靜態構建Boost 1.64 x86線程庫時,我很困難。 在Windows 10下,二進制工作正常但提出了System.BadImageFormatException Windows 7. 該問題位於Boost線程庫中,我最初靜態鏈接到我的C++ CLI程序集。
這裏是一個短碼來容易地重新產生問題:
TESTCLI。ħ - C++ CLI裝配故障代碼
#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被改變,使得升壓線程庫現在動態鏈接:
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_ALL_DYN_LINK BOOST_THREAD_DYN_LINK:http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html
這樣做,你就不必包裝所有您的應用程序加速動態庫。
你的意思是'boost :: asio'由一個庫使用'boost :: thread'嗎?無論如何,一旦我確實想使用'boost :: asio',並最終在我的本地小庫中以winsock結尾,並被C++/Cli包裝。我很抱歉,'boost'不是直接與C++/Cli聯繫的合適的庫。儘量避免它。 – 2011-04-14 22:22:25