2016-03-01 185 views
0

我使用Microsoft Visual Studio 2010並使用C++編寫。有沒有辦法將靜態鏈接與STL鏈接?

我的應用程序應該是輕量級的;因此我使用DDK的msvcrt.lib將我的應用程序與存在於任何Windows中的msvcrt.dll鏈接起來。這個技巧允許我不使用靜態鏈接(libcmt),也不使用MSVC Redistributables中的DLL;所以減少了我的可執行文件的大小。

但現在我需要在我的應用程序中使用STL。有沒有辦法只與STL鏈接一些庫?我從DDK拿了libcpmt.lib,並試圖與它聯繫;這是我得到了什麼:

1>main.obj : error LNK2001: unresolved external symbol "public: virtual char const * __thiscall std::exception::what(void)const " ([email protected]@[email protected]@UBEPBDXZ) 
1>main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall std::exception::~exception(void)" ([email protected]@@[email protected]) 
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall std::exception::exception(char const * const &)" ([email protected]@@[email protected]@Z) 
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall std::exception::exception(class std::exception const &)" ([email protected]@@[email protected]@@Z) 
1>main.obj : error LNK2001: unresolved external symbol "void __cdecl std::_Xlength_error(char const *)" ([email protected]@@[email protected]) 

如何鏈接我的libcpmt.lib從DDK應用?鏈接後將多少字節添加到可執行文件?是否有另一個(第三方)STL輕量級?

+1

只是fyi tst :: exception不是STL的一部分,它是C++標準庫的一部分。 – PeterT

+0

我知道;但它在'libcpmt.lib'中,不是嗎? – deselect

+1

IIRC MSVC中的STL根本不需要鏈接。話雖如此,你的應用程序可能比你想象的要沉重得多。你認爲'msvcrt便宜?它位於Microsoft不應該依賴的事物的黑名單上。當你觸摸它時,你的過程是自動懷疑的。預計Windows會啓動它的應用程序兼容性工作,以確保您的過時應用程序仍然運行在現代Windows版本上(現代=本世紀; MSVCRT可以追溯到1998年)。 – MSalters

回答

0

這可能是不可能的,至少不可靠。 C++標準庫可能依賴於C標準庫的某些功能,但您試圖使用的未版本化的msvcrt.dll是非標準的。

相關問題