visual在没有运行时的情况下构建windows c++库
visual Building windows c++ libraries without a runtime?
我正在尝试创建一个用于windows/MSVC的c++库。
我的问题是,为了正确链接,我似乎需要分发一堆不同的版本,链接到MSVC的c++运行时的不同版本——单线程和多线程、调试和发布、不同的编译器版本、各种其他安全性和其他选项。
我希望只分发两个,32位和64位。
我的想法是可能为我的所有STL类型使用不同的新操作符(比如mynew)和自定义分配器。创建lib时,/nodefaultlib。然后,当从父项目链接时,要求他们将mynew转换为new,并将stl分配器转换为标准分配器(或他们选择的分配器)。我想我需要做删除和其他一些功能。当然,我会提供一个带有库的thunking实现的示例,但这有望为每个人省去很多麻烦。
这可能吗?有人试过这个吗?是否有在windows/MSVC上创建/分发库的最佳实践?
您想要静态链接,作为一般答案。
关于Chris的回答(不想降低士气,因为这基本上很好,但…):
不要链接到msvcrt.dll(未经转换的);这是操作系统特定版本的DLL,如果你链接到它,你的应用程序可能无法在其他版本的Windows上运行。据我所知,你应该一直链接到msvcrt###.dll。DDK可能包含它的lib,但除非你真的知道自己在做什么,否则不要链接到它。
静态链接到C++运行库:
- 打开项目属性
- 转到"配置属性"|C/C++|"代码生成"部分
- 将运行库设置为多线程(/MT)
如果使用C++,则不需要使用自定义分配器,并且可以将所有分配都封装在std::tr1::shared_ptr
周围(可以在其中指定一个解除分配函数)。这确保了即使客户端释放了对共享指针的最后一个引用,在释放对象时仍会调用库(或库的CRT)中的代码。
这是解决"DLL边界地狱"的一种方法。希望有帮助!:-)
编辑:我想我误解了你提问的意图。我想你只是想要一个可以安装在任何地方的DLL版本,而不是因为担心DLL边界地狱而不希望对CRT有任何依赖。在这种情况下,您可以将程序链接到msvcrt.dll
。这在任何Windows系统上都可用。
您没有从我那里听到这一消息,但很明显,在驱动程序开发工具包中,您可以找到某种导入库,它允许Visual Studio的新版本链接到msvcrt
。
- 无法使用Qt Creator在Windows中构建yaml-cpp
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 如何在 Linux for Windows 上通过 MinGW 构建静态 ICU 的 Boost
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- 坚持编译QDoc以在Windows上构建qt5
- MSYS2 MinGW64 在 Windows 上构建 GMP/MPFR 作为静态库,并将它们链接到使用 CL 编译的
- 如何使用PJSIP库在MINGW上安装NASM,以构建Windows应用程序的OpenH264库
- 在开始使用 ISOCPP.net C++ 构建 Windows 时遇到问题 (Nuwen)
- 构建 Windows 7 驱动程序时出错
- 关于构建windows dll的建议
- 在使用 CMake 构建 Windows DLL 期间运行单元测试
- QtCreator如何在构建Windows应用程序时避开控制台窗口
- 如何使用C++(非控制台应用程序)在Eclipse中构建Windows GUI应用程序
- 使用cmake构建Windows DLL的简单示例
- 使用Visual c++ 2015工具集构建Windows/Windows Phone 8.1
- Boost-Build:从linux构建windows可执行文件
- visual在没有运行时的情况下构建windows c++库