场景:
在Debian 8上,我已经安装了1.0.1t版本的openssl库(运行时和开发版)。这些是使用apt-get
安装的。因此,默认位置:/usr/include/
和/usr/lib
。
我编译了一个使用openssl库的文件:(从qmake
生成)
g++ -c -pipe -O2 -fPIC -std=gnu++11 -Wall -W -DHAVE_OPENSSL -D_REENTRANT -DENABLE_IPV6 -DTIXML_USE_STL -DBOOST_FILESYSTEM_DEPRECATED -DQT_NO_DEBUG -I. -I. -Isrc -Isrc/engine -Isrc/gui -Isrc/gui/qt -Isrc/gui/qt/qttools -Isrc/net -Isrc/engine/local_engine -Isrc/engine/network_engine -Isrc/config -Isrc/core -Isrc/third_party/websocketpp -isystem /usr/include -isystem /usr/include/mysql -isystem /usr/include/mysql++ -I/opt/gsasl/include -I~/Qt/5.9.0_static/mkspecs/linux-g++ -o obj/crypthelper.o src/core/common/crypthelper.cpp
完美的作品。请注意,不包含
/usr/local/
标头。目标:
使用openssl 1.1.1b执行相同操作(重现错误)
我从源代码安装了openssl 1.1.1b(不删除1.0.1t),该软件安装到
/usr/local
中。首先,要确保没有任何更改,我运行相同的命令(该命令未引用
/usr/local
),并且抱怨:In file included from /usr/include/openssl/evp.h:66:0,
from /usr/include/openssl/x509.h:73,
from /usr/include/openssl/ssl.h:156,
from src/core/openssl_wrapper.h:75,
from src/core/common/crypthelper.cpp:34:
/usr/local/include/openssl/opensslconf.h:20:3: error: #error OPENSSL_ALGORITHM_DEFINES no longer supported <---- WHY???
# error OPENSSL_ALGORITHM_DEFINES no longer supported
为什么它从位于
/usr/local
的文件中抱怨?为什么包括在内?没有对该目录的引用!我不明白
PD:对不起,没有头衔。随时进行更正。
最佳答案
/usr/local/include
在编译器的默认搜索路径中
您可以通过调用echo | g++ -E -v -
进行检查
您应该获得类似于以下的输出:
...
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
...
通过传递
-isystem /usr/include
,将/usr/include
移至搜索列表的顶部,并首先找到openssl 1.0.1的标题。但是<openssl/opensslconf.h>
位于/usr/include/x86_64-linux-gnu/openssl/opensslconf.h
之后搜索的其他位置(对我来说是/usr/local/include
),因此首先找到openssl 1.1.1的版本。您可以通过以下方法解决此问题:找到包含正确的opensslconf.h的目录,然后修改构建以通过
-isystem
标志将其传递