首页 > 解决方案 > 在 g++ 中覆盖 -shared 选项

问题描述

我正在构建一些 Cython 扩展,并且必须将其与静态库链接(其中包含 CUDA 代码,因此必须是静态的):

running build_ext
building 'k3lib' extension
gcc -pthread -B /home/kelvin/anaconda3/envs/torch/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/kelvin/repos/tools/include -I/home/kelvin/anaconda3/envs/torch/include/python3.8 -c main.cpp -o build/temp.linux-x86_64-3.8/main.o -O3 -march=native
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
g++ -pthread -shared -B /home/kelvin/anaconda3/envs/torch/compiler_compat -L/home/kelvin/anaconda3/envs/torch/lib -Wl,-rpath=/home/kelvin/anaconda3/envs/torch/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.8/main.o /home/kelvin/repos/tools/include/libk2.a -L/home/kelvin/repos/tools/include -lk2 -o build/lib.linux-x86_64-3.8/k3lib.cpython-38-x86_64-linux-gnu.so -static -Wl,-Bstatic -flinker-output=exec

但是,Cython 的 g++ 编译命令-shared -fPIC默认包含选项。我通过此设置文件在命令末尾尝试了许多选项(静态库位于$(LOCAL_INCLUDE)/libk2.a):

includes = [os.getenv("LOCAL_INCLUDE")]

ext_modules = [
    Extension("k3lib", sources=["main.pyx"],
              libraries=["k2"], include_dirs=includes, library_dirs=includes, language="c++",
              extra_compile_args=["-O3", "-march=native"], extra_objects=[f"{includes[0]}/libk2.a"],
              extra_link_args=['-static', '-Wl,-Bstatic', '-flinker-output=exec'])
]
#extra_objects=[f"{includes[0]}/libk2.a"]
#extra_link_args=['-static']
setup(name="k3lib", ext_modules=cythonize(ext_modules, language_level="3"))

尽管如此,g++ 认为我想构建一个共享库,因此会出现错误消息。有没有办法覆盖该-shared选项?我打算进入 Cython 的文件并自己编辑它们,但想知道有没有更简单的方法?

背景:我在 SO 上关注这个问题,但无法复制他们的成功。

标签: c++g++cython

解决方案


推荐阅读