Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查是否安装了openssl或cryptopp,并使用系统中实际存在的库(已安装)?_C_Openssl_C Preprocessor_Crypto++ - Fatal编程技术网

如何检查是否安装了openssl或cryptopp,并使用系统中实际存在的库(已安装)?

如何检查是否安装了openssl或cryptopp,并使用系统中实际存在的库(已安装)?,c,openssl,c-preprocessor,crypto++,C,Openssl,C Preprocessor,Crypto++,我编写了一个加密/解密缓冲区的函数(同一函数的两个版本——第一个是cryptopp,第二个是openssl) 我想做这样的事情: #if defined OPENSSL run_aes_openssl(...); #elif defined CRYPTOPP run_aes_crytopp(...); #else error(...); #end 可能吗 如何检查是否安装了openssl或cryptopp,并使用系统中实际存在的库(已安装) 如果您的应用程序是在它正在运行的

我编写了一个加密/解密缓冲区的函数(同一函数的两个版本——第一个是cryptopp,第二个是openssl)

我想做这样的事情:

#if defined OPENSSL
   run_aes_openssl(...);
#elif defined CRYPTOPP
   run_aes_crytopp(...);
#else
    error(...);
#end
可能吗

如何检查是否安装了openssl或cryptopp,并使用系统中实际存在的库(已安装)

如果您的应用程序是在它正在运行的系统上构建的,那么您显示的代码是正确的。据推测,构建系统将同时检测OpenSSL和Crypto++。如果两者都可用,那么您的代码似乎更喜欢OpenSSL

如果您的应用程序是在别处构建的,并且需要在运行时进行检查,那么您将需要、
dlsym
dlclose
和朋友

在运行时检查的情况下,最好构建一个分派表并通过它进行调用。例如,您可能有一个表,其中包含指向内部
运行\u aes\u openssl
运行\u aes\u crytop
等的函数指针

启动时,根据
dlopen
的结果填充表格。如果您找到了OpenSSL,那么就用OpenSSL设备填充您的表。如果找到Crypto++,则使用Crypto++gear填充表


C++与
dlopen
和朋友一起使用会很痛苦,因为名字会被弄乱。更糟糕的是,发行版和运行库版本之间的损坏情况有所不同。例如,这里有一个生成RSA私钥的函数:

RSA::PrivateKey key;
key.GenerateRandomWithKeySize(prng, 1024);
下面是Mac OS X上相应的函数名。Debian和Red Hat可能会有所不同

$ nm cryptopp-test.exe | grep -i GenerateRandom | grep -i RSA
00000001000c7d80 T __ZN8CryptoPP21InvertibleRSAFunction14GenerateRandomERNS_21RandomNumberGeneratorERKNS_14NameValuePairsE
00000001000c8eb0 T __ZThn120_N8CryptoPP21InvertibleRSAFunction14GenerateRandomERNS_21RandomNumberGeneratorERKNS_14NameValuePairsE

其实没那么简单。要查找已定义的宏,必须包含定义该宏的标题。C没有类似“include foo.h if it exists”的内容;它必须存在,否则会出现编译错误

通常,这将由编译前运行的脚本进行排序。您的脚本检查位置,如
/usr/include
/usr/local/include
,以查看是否存在OpenSSL头;然后它输出一个Makefile,它包含在CFLAGS
-DHAVE\u OPENSSL
中。然后您的代码可以检查该宏

这有点喧闹,为了保持简单,您可以要求用户手动编辑一个文件,例如,使用名为
user\u config.h
的东西分发您的项目,用户应该在编译之前编辑该文件,以指定他们将OpenSSL放在何处,等等


有一个名为GNU Autoconf的预设系统,其中包含一个脚本,用于检查您的系统是否存在任何问题。这有它的优点和缺点;它使人们下载源代码变得更容易,但它过于庞大,对自己来说可能是一项艰巨的工作。

事实上,这是解决我问题的最佳答案:)我找到了如何检查openssl是否安装了abash脚本的方法:但是,您是否愿意告诉我有关Makefile部分的更多信息?我的脚本应该生成一个Makefile,或者只需导出env变量
-DHAVE_OPENSSL
,然后在Makefile中检查它是否已定义?至少这是我希望这样做的最佳方式-因此,如果您有时间-请提供更多指导!)@Yak-Matt当然可以帮你更多,但当你遇到下一个问题时,你需要问一个新问题。记住,你只是问一些高层次的想法“可能吗”。您还应该接受Matt的回答,以便将问题移出“未回答”队列。它有助于保持场地整洁。看见