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

时间:2014-06-19 15:25:24

标签: c openssl c-preprocessor crypto++

我编写了加密/解密缓冲区的函数(同一函数的2个版本 - 首先是cryptopp,第二个是openssl)。

我想做这样的事情:

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

有可能吗?

2 个答案:

答案 0 :(得分:2)

这不是那么简单。为了找到定义的宏,您必须包含定义该宏的标头。并且C没有“include foo.h iff it exists”之类的东西;它必须存在,否则会出现编译错误。

通常,这将由您在编译之前运行的脚本进行整理。您的脚本会检查/usr/include/usr/local/include等位置,以查看OpenSSL标头是否存在;然后它输出一个包含在CFLAGS -DHAVE_OPENSSL中的Makefile。然后您的代码可以检查该宏。

这是相当多的喧嚣,为了简单起见,您可以要求用户手动编辑文件,例如使用在编译之前编辑的用户应该编辑的user_config.h来分发您的项目,以指定他们放置OpenSSL的位置等等。

有一个名为GNU Autoconf的预设系统,它包含一个脚本,用于检查系统中是否有阳光下的所有内容。这有其优点和缺点;它使下载源代码的内容更容易,但它很臃肿,对你自己来说很难。

答案 1 :(得分:1)

  

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

如果您的应用程序是在运行的系统上构建的,那么您显示的代码就可以了。据推测,构建系统将检测OpenSSL和Crypto ++。在两个都可用的情况下,看起来您的代码将支持OpenSSL。

如果您的应用程序是在其他地方构建的并且需要在运行时检查,那么您将需要dlopendlsymdlclose和朋友。

在运行时检查的情况下,最好建立一个调度表并通过它进行调用。例如,您可能有一个表格,其中包含您的内部run_aes_opensslrun_aes_crytopp等的函数指针。

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


由于名称错误,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