如何使用icc覆盖Python的distutils gcc链接器?

5
我成功地在Ubuntu 14.04上从源代码构建了cython,如此SE问题/答案所述 Compiling cython From source with icc,并从这里下载了源代码 - Cython source code download
编译cython的命令是
CC=icc LINKCC=icc python3.4 setup.py build
我附上了构建日志。它仍然使用gcc进行链接。以下是构建日志的示例。
看起来CC=icc LINKCC=icc似乎没有改变链接器为icc。它仍然使用x86_64-linux-gnu-gcc。当我将环境变量LDFLAGS = -lirc设置为时,环境变量被传递给gcc而不是icc。 还有,当我在BuildExecutable.py中放置打印语句时,它们没有被调用。
icc -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c /home/aswin/libPython/Cython-0.24/Cython/Plex/Scanners.c -o build/temp.linux-x86_64-3.4/home/aswin/libPython/Cython-0.24/Cython/Plex/Scanners.o
icc: command line warning #10006: ignoring unknown option '-fwrapv'
creating build/lib.linux-x86_64-3.4
creating build/lib.linux-x86_64-3.4/Cython
creating build/lib.linux-x86_64-3.4/Cython/Plex
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -lirc -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.4/home/aswin/libPython/Cython-0.24/Cython/Plex/Scanners.o -o build/lib.linux-x86_64-3.4/Cython/Plex/Scanners.cpython-34m.so

我该如何修复它?

2个回答

9

您需要通过设置export LDSHARED="icc -shared"来覆盖链接器。这将生成icc链接器。以下是通过输入CC=icc python3.4 setup.py build_ext命令的构建日志示例。

或者,您也可以通过输入LDSHARED="icc -shared" CC=icc python3.4 setup.py build_ext来完成相同的操作。

icc -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c /home/a/libPython/Cython-0.24/Cython/Plex/Scanners.c -o build/temp.linux-x86_64-3.4/home/a/libPython/Cython-0.24/Cython/Plex/Scanners.o
icc: command line warning #10006: ignoring unknown option '-fwrapv'
creating build/lib.linux-x86_64-3.4
creating build/lib.linux-x86_64-3.4/Cython
creating build/lib.linux-x86_64-3.4/Cython/Plex
icc -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.4/home/a/libPython/Cython-0.24/Cython/Plex/Scanners.o -o build/lib.linux-x86_64-3.4/Cython/Plex/Scanners.cpython-34m.so
cythoning /home/a/libPython/Cython-0.24/Cython/Plex/Actions.py to /home/a/libPython/Cython-0.24/Cython/Plex/Actions.c

Gansub,你设置了环境变量 LDSHARED="icc -shared" 吗?如何设置?是这样的 LDSHARED="icc -shared" CC=icc python3.4 setup.py build_ext - osgx
你能在你的回答中添加这个命令吗?也可以在命令LDSHARED=smth之前添加它来设置。(只是为了使回答对未来的访问者更有用和清晰) - osgx
gansub,它没有链接或找不到吗?您能否在出现问题的某个库/可执行文件上运行ldd?如果已链接但“未找到”,则可以将lib路径添加到/etc/ld.so.conf或LD_LIBRARY_PATH或链接步骤的rpath选项中(即“icc-shared”,添加选项)。 - osgx

0
你可以尝试在链接选项中添加-static-intel,这样所有的Intel特定函数都将被静态链接。

我阅读了你之前问题中的代码链接。LDFLAS 可能不是正确的选项,但你可以通过 python setup.py --help build_ext 检查是否有任何有用的信息。 - kangshiyin
我运行了那个命令并且看到了编译器扩展,如--compiler,但没有看到连接器的扩展。 - gansub
我在这个文件https://github.com/cython/cython/blob/master/Cython/Build/BuildExecutable.py中放置了打印语句,但是它没有被调用。 - gansub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接