C 为什么可以';我不能用多线程编译OpenSSL吗?(make-j3)

C 为什么可以';我不能用多线程编译OpenSSL吗?(make-j3),c,linux,openssl,makefile,C,Linux,Openssl,Makefile,我正在尝试构建OpenSSL。如果我使用make(1个线程)构建它,它的编译就可以了。但是如果我用3个线程(make-j3)构建它,我会得到很多链接器错误: bntest.o: In function `message': bntest.c:(.text+0x30): undefined reference to `BIO_puts' bntest.c:(.text+0x3b): undefined reference to `BIO_puts' bntest.o: In function `t

我正在尝试构建OpenSSL。如果我使用
make
(1个线程)构建它,它的编译就可以了。但是如果我用3个线程(
make-j3
)构建它,我会得到很多链接器错误:

bntest.o: In function `message':
bntest.c:(.text+0x30): undefined reference to `BIO_puts'
bntest.c:(.text+0x3b): undefined reference to `BIO_puts'
bntest.o: In function `test_add':
bntest.c:(.text+0xe2): undefined reference to `BN_init'
bntest.c:(.text+0xec): undefined reference to `BN_init'
bntest.c:(.text+0xf6): undefined reference to `BN_init'
bntest.c:(.text+0x107): undefined reference to `BN_bntest_rand'
bntest.c:(.text+0x119): undefined reference to `BN_print'
bntest.c:(.text+0x126): undefined reference to `BIO_puts'
bntest.c:(.text+0x156): undefined reference to `BN_add'
bntest.c:(.text+0x166): undefined reference to `BN_add'
bntest.c:(.text+0x191): undefined reference to `BN_bntest_rand'
bntest.c:(.text+0x1d3): undefined reference to `BN_add'
bntest.c:(.text+0x1f5): undefined reference to `BN_print'
bntest.c:(.text+0x202): undefined reference to `BIO_puts'
bntest.c:(.text+0x20f): undefined reference to `BN_print'
bntest.c:(.text+0x21c): undefined reference to `BIO_puts'
bntest.c:(.text+0x264): undefined reference to `BN_free'
bntest.c:(.text+0x26e): undefined reference to `BN_free'
bntest.c:(.text+0x278): undefined reference to `BN_free'
bntest.o: In function `test_sub':
bntest.c:(.text+0x2af): undefined reference to `BN_init'
bntest.c:(.text+0x2b9): undefined reference to `BN_init'
bntest.c:(.text+0x2c3): undefined reference to `BN_init'
bntest.c:(.text+0x2e0): undefined reference to `BN_bntest_rand'
bntest.c:(.text+0x322): undefined reference to `BN_sub'
...and so on, for hundreds of lines...
要明确的是,我运行的命令的确切顺序是:

$ wget https://www.openssl.org/source/openssl-1.0.1l.tar.gz
$ tar -xzf openssl-1.0.1l.tar.gz
$ cd openssl-1.0.1l
$ ./config
$ make -j3
我在x64机器上运行Ubuntu 14.10

这可能是一个RTFM类型的问题,但我还没有看到任何地方说不支持使用多线程构建OpenSSL


所以问题是:构建支持多线程的OpenSSL吗?如果是这样,我做错了什么?

正如MadScientist的评论所指出的,必须设计一个makefile来支持并行构建。显然,OpenSSL应该支持并行制造,但他们的一项研究表明,这种支持有几次被打破了。此错误最近于2014年12月12日被标记为已修复,因此使用更新版本的OpenSSL可能会修复您遇到的问题。

正如MadScientist的评论所示,makefile必须设计为支持并行构建。显然,OpenSSL应该支持并行制造,但他们的一项研究表明,这种支持有几次被打破了。此错误最近在2014年12月12日被标记为已修复,因此使用较新版本的OpenSSL可能会修复您遇到的问题。

学究式的说,make不是多线程的,也不使用线程来实现并行性。无论如何,从您得到的结果来看,似乎很清楚openssl不支持make(
-j
)中的并行作业,不管是否明确说明了这一点。太糟糕了,openssl决定使用自己的configure/make环境而不是使用autotools,autotools默认支持make中的并行作业。@MadScientist:如果
make
不是多线程的,这是否意味着它将
fork()
exec()
作业进程(即
gcc
),并生成N个进程(其中N是
--jobs
)的数量,然后在生成另一个job之前等待子进程退出(以确保运行的job数量正确。构建的缓慢部分不是(通常)处理make可以,但编译器或任何构建工具make调用的处理可以。因此,在并行make中,它只是同时运行更多的工具。不使用多线程可以节省make本身的大量复杂性,特别是因为原始代码是在多线程程序普遍使用之前30多年编写的:它可以帮助我们有很多全局变量,等等。你也可以看看修复makefile。我想有两个有趣的例子。我手头没有Stallman的书,所以我不能告诉你怎么做:(但是有一种简单的方法可以表达构建规则依赖关系。@疯狂科学家:谢谢你帮助我理解这一点!学究式的说,make不是多线程的,也不使用线程来实现并行性。无论如何,从你得到的结果看,似乎很清楚openssl不支持make中的并行作业(
-j
),无论是否明确说明。太糟糕了,openssl决定使用自己的配置/制作环境,而不是使用自动工具,自动工具默认支持make中的并行作业。@MadScientist:如果
make
不是多线程的,这是否意味着它将
fork()
exec()
作业进程(即,
gcc
),生成N个进程(其中N是
--作业的数量
)?然后在生成另一个作业之前等待子进程退出(以确保运行作业的数量正确。构建的缓慢部分不是(通常)处理make可以,但编译器或任何构建工具make调用的处理可以。因此,在并行make中,它只是同时运行更多的工具。不使用多线程可以节省make本身的大量复杂性,特别是因为原始代码是在多线程程序普遍使用之前30多年编写的:它可以帮助我们有很多全局变量,等等。你也可以看看修复makefile。我想有两个有趣的例子。我手头没有Stallman的书,所以我不能告诉你怎么做:(但是有一种表达构建规则依赖关系的简单方法。@MadScientist:谢谢你帮助我理解这一点!我曾尝试在i5(dualcore,HT)上编译OpenSSL 1.0.2)。它不会抛出任何错误。但是,它不会显著加快。
make 92,81s用户12,94s系统100%cpu 1:45,66总速度-j2 102,38s用户12,60s系统142%cpu 1:20,50总速度-j4 108,85s用户13,26s系统151%cpu 1:20,42总速度
@zakjan我不一定期望它会显著加快。make文件通常有bottlenecks命令不能并行运行(例如,最后的链接步骤),并且可能其他因素(如内存带宽或磁盘I/O)限制了它的构建速度。我曾尝试在i5(dualcore,HT)上编译OpenSSL 1.0.2。它不会抛出任何错误。但是,它不会显著加快。
make 92,81s用户12,94s系统100%cpu 1:45,66总速度-j2 102,38s用户12,60s系统142%cpu 1:20,50总速度-j4 108,85s用户13,26s系统151%cpu 1:20,42总速度
@zakjan我不一定期望它会显著加快。make文件通常有bottlenecks命令不能并行运行(例如,最后一个链接步骤),并且可能是内存带宽或磁盘I/O等其他因素限制了它的构建速度。