string.h:29:8:错误:预期的标识符

时间:2015-02-26 21:24:38

标签: ssl nginx libressl

我正在尝试使用此脚本使用自定义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.
..

问题是什么?怎么解决呢? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

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

现在更正了,以前构建和使用libressl的方法不适用于以前版本的脚本。 (只需复制所有包含并剥离lib)

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

答案 1 :(得分:1)

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
...

  

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

好吧,这可能很痛苦,因为我必须与nginx(FIPS验证的OpenSSL)类似。

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

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

删除与OpenSSL相关的-L

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