如何将 OpenSSL v3 二进制文件与 Windows 上的应用程序捆绑在一起?
有了可执行文件,我有
libcrypto-3-x64.dll
和 libssl-3-x64.dll
。
在
./lib
目录中,我在 DLLs
和 engines-3
中有 ossl-modules
。
很好,但是要启动应用程序,我被迫使用
*.bat
文件,其中包含以下内容:
set OPENSSL_MODULES=./lib/ossl-modules
set OPENSSL_ENGINES=./lib/engines-3
start "" my_app.exe %
如何避免使用这个
*.bat
文件,并且只有my_app.exe
不会产生Windows错误消息?
想补充一下:
int main( int argc, char ** argv )
{
qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );
并不能解决问题。
还有以下
*.manifest
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<environment name="OPENSSL_MODULES" value="./lib/ossl-modules" />
<environment name="OPENSSL_ENGINES" value="./lib/engines-3" />
</windowsSettings>
</application>
</assembly>
也不能解决问题。
谢谢。
如果
bat
文件有效,但此代码无效:
int main( int argc, char ** argv )
{
qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );
这意味着您必须在操作系统加载进程之前设置环境变量。
所以就这么做吧。 重新-设置环境值后加载进程:
int main( int argc, char ** argv )
{
QByteArray envval = qgetenv( "OPENSSL_MODULES" );
// assumes a "default constructed" QByteArray will
// return true here - not tested
if ( ennval.isEmpty() )
{
qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );
execv( argv[ 0 ], argv );
perror( "execv" );
exit( 1 );
}
.
.
.
标题和错误检查已被省略,以使代码示例足够短,因此它没有垂直滚动条。
并且关闭微软的可笑之词,“我们已经弃用了所有我们可以逃脱的便携式非微软产品”“警告”
请注意,这些环境变量假定当前工作目录是该特定
lib
目录的父目录。您可以通过首先查找应用程序二进制文件的绝对路径,然后使用它来确定lib
目录的绝对路径,来添加相当多的稳健性并删除要求。