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.
..
有什么问题以及如何解决?
感谢您的帮助。
strndup
在string.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_PRELOAD
和 DYLD_LIBRARY_PATH
技巧。它会一直有效。
我是您使用 LibreSSL 构建 Nginx 的脚本的创建者。
现已更正,以前构建和使用 libressl 的方法不适用于以前版本的脚本。 (简单地复制所有包含并剥离库)
该脚本现在将 libressl 安装在一个设置的目录中并将其提供给 nginx,这样,所有不需要使用该库的 include(像这样 string.h)都不是 nginx 构建过程的一部分.
我正在尝试使用此脚本使用自定义 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.
..
有什么问题以及如何解决?
感谢您的帮助。
strndup
在string.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_PRELOAD
和 DYLD_LIBRARY_PATH
技巧。它会一直有效。
我是您使用 LibreSSL 构建 Nginx 的脚本的创建者。
现已更正,以前构建和使用 libressl 的方法不适用于以前版本的脚本。 (简单地复制所有包含并剥离库)
该脚本现在将 libressl 安装在一个设置的目录中并将其提供给 nginx,这样,所有不需要使用该库的 include(像这样 string.h)都不是 nginx 构建过程的一部分.