string.h:29:8: error: expected identifier

string.h:29:8: error: expected identifier

我正在尝试使用此脚本使用自定义 openssl »libressl« 编译 nginx:https://gist.github.com/Belphemur/3c022598919e6a1788fc

使用 libressl 2.1.1 一切正常。 问题是 libressl 2.1.1 存在一些安全问题,这些问题已由较新的版本解决。
但是我无法让构建与 libressl 2.1.2 或 libressl 2.1.3(最新版本)一起使用。

我遇到的问题:

..
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I src/core -I src/event -I src/event/modules -I src/os/unix -I /tmp/build/pcre-8.36 -I /tmp/build/libressl-2.1.2/.openssl/include -I objs \
        -o objs/src/core/nginx.o \
        src/core/nginx.c
In file included from /usr/include/string.h:635:0,
                 from /tmp/build/libressl-2.1.2/.openssl/include/string.h:6,
                 from src/os/unix/ngx_linux_config.h:27,
                 from src/core/ngx_config.h:26,
                 from src/core/nginx.c:8:
/tmp/build/libressl-2.1.2/.openssl/include/string.h:29:8: error: expected identifier or ‘(’ before ‘__extension__’
 char * strndup(const char *str, size_t maxlen);
        ^
make[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/tmp/build/nginx-1.7.9'
make: *** [build] Error 2
All done.
..

有什么问题以及如何解决?
感谢您的帮助。

strndupstring.h中提供。您无需在此处提供:

/tmp/build/libressl-2.1.2/.openssl/include/string.h:29:8: error: expected identifier or ‘(’ before ‘__extension__’
char * strndup(const char *str, size_t maxlen);

我将从源中删除 string.h 的副本,并使用平台提供的 string.h 用于 strndup

事实上,我不知道 string.h 是从哪里来的,因为我的系统上没有它(而且我经常构建和使用最新的 OpenSSL):

$ find /usr/local/ssl/ -name string.h
$ find /usr/local/ssl/ -name *.h
/usr/local/ssl/include/openssl/rc4.h
/usr/local/ssl/include/openssl/crypto.h
/usr/local/ssl/include/openssl/ts.h
/usr/local/ssl/include/openssl/ecdsa.h
/usr/local/ssl/include/openssl/opensslconf.h
...

I'm trying to compile nginx with custom openssl »libressl« using this script: https://gist.github.com/Belphemur/3c022598919e6a1788fc

好的,这可能很痛苦,因为我不得不对 nginx(FIPS 验证的 OpenSSL)做类似的事情。

最简单的处理方法是从源代码构建 OpenSSL 并将其安装到 /usr/local/ssl。然后,grep -lcrypto-lssl 的 nginx 文件。当你找到它们时,将它们替换为 OpenSSL 的静态存档:

  • -lcrypto更改为/usr/local/ssl/lib/libcrypto.a
  • -lssl 更改为 /usr/local/ssl/lib/libssl.a

并删除与 OpenSSL 相关的 -L

这将确保您在编译时和 运行 时使用您的 OpenSSL 版本,而无需 LD_PRELOADDYLD_LIBRARY_PATH 技巧。它会一直有效。

我是您使用 LibreSSL 构建 Nginx 的脚本的创建者。

现已更正,以前构建和使用 libressl 的方法不适用于以前版本的脚本。 (简单地复制所有包含并剥离库)

该脚本现在将 libressl 安装在一个设置的目录中并将其提供给 nginx,这样,所有不需要使用该库的 include(像这样 string.h)都不是 nginx 构建过程的一部分.