我在VS2012 C ++上有以下项目结构:
cryptopp
:从cryptopp项目下载并构建。
AccessLib
:使用cryptopp函数构建静态库。
TestApp
:使用AccessLib(和间接cryptolib)的Win32控制台应用程序
UserApp
:一个支持CLR的Windows交互式应用程序(/clr
),它使用AccessLib(和间接的cryptolib)
好吧,我的第一次尝试是让这个解决方案能够构建我的控制台应用程序和我的Windows应用程序。顺便说一下,cryptopp
是以手册和this SO link中描述的方式构建的。 cryptopp项目的所有测试在构建环境中运行良好。
以下是我构建项目的方法:
将AccessLib
分别设置为/Mtd
或/MT
以进行调试或发布,并与来自cryptolib.lib
和cryptodir\Win32\Output\Debug
的{{1}}进行关联分别
将cryptodir\Win32\Output\Release
分别设置为TestApp
或/MTd
,分别用于调试或发布,链接到从上面步骤生成的/MT
。
到目前为止很好,但在构建AccessLib.lib
时,它不起作用UserApp
需要TestApp
,这与/clr
或MTd
不兼容。
所以,这是我的第一个问题:我无法使用CLR程序链接到具有/MT
或/MTd
的静态库....我应该怎么做才能构建我的{ {1}}程序到我的静态库/MT
,它也可以访问/clr
作为静态库吗?我是否需要将所有内容转换为DLL项目?
好吧,我甚至尝试转换为使用cryptopp作为DLL,这样:
AccessLib.lib
分别设置为cryptopp
或AccessLib
进行调试或发布,分别与/MDd
和/MD
的{{1}}相关联。< / LI>
该步骤很顺利,但在尝试将cryptolib.lib
同时构建为cryptodir\Win32\DLL_Output\Debug
或cryptodir\Win32\DLL_Output\Release
分别用于调试或发布时,链接到从上面步骤生成的TestApp
,我有几个错误,如:
/MDd
我没有使用该配置构建/MD
。
感谢帮助使整个事情协同工作。我想完全避免使用DLL。我最初的想法是将所有内容都作为静态库,但我不知道我是否可以在该解决方案配置上实现这一点。
帮助表示赞赏。
答案 0 :(得分:1)
您无法将使用MT或MTd编译的库链接到符合MD或MDd的程序。他们有不同的CRT库。
您可以使用MD或MDd
重建cryptopp答案 1 :(得分:1)
这一步很顺利,但是当尝试将TestApp构建为/ MDd或/ MD for Debug或Release时,链接到从上面步骤生成的AccessLib.lib,我得到了几个错误,如...
您正在混合和匹配运行时。您应该更改Crypto ++并使其使用动态运行时链接C / C ++运行时库。请参阅Crypto ++ wiki上的Visual Studio | Dynamic Runtime Linking。
我想完全避免使用DLL。我最初的想法是将所有内容都作为静态库,但我不知道我是否可以在该解决方案配置上实现这一点。
是的,这是首选。它可以工作,但您需要使用动态运行时链接构建Crypto ++静态库。您想要的项目是 cryptlib
,其输出位于 <crypto++ dir>/Output/{Debug|Release}/{Win32|x64}
。请参阅前面的链接。
您还应该避免使用FIPS DLL。 DLL项目是 cryptdll
,其输出位于 <crypto++ dir>/DLL_Output/...
中。 DLL是特殊用途的,它只提供FIPS算法。它不是一个通用的DLL,它缺少你需要的大部分东西,它会带来很多痛苦和痛苦。
我甚至会告诉别人完全删除 cryptdll
和 dlltest
项目因为它们造成了很多麻烦。另请参阅Crypto ++ wiki上的FIPS DLL。
使用VS2012静态库,控制台应用程序和clr程序上的cryptopp链接错误
值得注意的是......加密++不使用 /clr
选项。您需要修改静态库项目设置并添加它。
静态库的项目名为 cryptlib
。您需要为 Win32 Debug , Win32 Release , x64 Debug 和 x64 Release 执行此操作。