我编写了加密/解密缓冲区的函数(同一函数的2个版本 - 首先是cryptopp,第二个是openssl)。
我想做这样的事情:
#if defined OPENSSL
run_aes_openssl(...);
#elif defined CRYPTOPP
run_aes_crytopp(...);
#else
error(...);
#end
有可能吗?
答案 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。
如果您的应用程序是在其他地方构建的并且需要在运行时检查,那么您将需要dlopen
,dlsym
,dlclose
和朋友。
在运行时检查的情况下,最好建立一个调度表并通过它进行调用。例如,您可能有一个表格,其中包含您的内部run_aes_openssl
,run_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