C++11 将静态库链接到共享库(例如openmp)是一个好主意吗

C++11 将静态库链接到共享库(例如openmp)是一个好主意吗,c++11,openmp,static-libraries,C++11,Openmp,Static Libraries,我正在linux系统上构建一个共享库,该库将用于一个项目,该项目将部署在服务器上的Docker中。此共享库使用openmp。因此,我想知道它是否更好(或更便于携带) openmp静态链接到我的共享库 我应该在Docker中正确安装gcc,以便找到openmp 将openmp的.so与我的库一起分发 如果选项1是最好的,有人能提供正确的方法来使用cmake吗 我在下面添加了一些关于该主题的文档: 通常不能将静态库链接到共享库 因为静态库(lib*.a)不包含(PIC),但共享库需要PIC(

我正在linux系统上构建一个共享库,该库将用于一个项目,该项目将部署在服务器上的Docker中。此共享库使用openmp。因此,我想知道它是否更好(或更便于携带)

  • openmp静态链接到我的共享库
  • 我应该在Docker中正确安装gcc,以便找到openmp
  • 将openmp的.so与我的库一起分发
  • 如果选项1是最好的,有人能提供正确的方法来使用cmake吗

    我在下面添加了一些关于该主题的文档:


    通常不能将静态库链接到共享库

    因为静态库(
    lib*.a
    )不包含(PIC),但共享库需要PIC(实际上)

    (从理论上讲,非PIC共享库是可能的;但它们包含的内容太多,以至于“共享”方面会丢失,并且会有很多工作。因此,在实践中,每个共享库都需要是PIC,以允许其在不同的进程中位于不同的地址,并且仍然保持共享)

    读德雷珀的报纸

    但是,您可以将一个共享库(例如
    libopenmp.so
    )链接到另一个库(您的共享库,请参阅)。然后,使用共享库的程序将需要
    libopenmp.so

    因此,您可以执行2或3项操作,甚至可以将库打包为适当的包(这取决于
    libopenmpi2
    Debian包)

    你可能想理解


    你应该更了解你的生活。为此,请使用和。对于第一个示例,请尝试
    cat/proc/self/maps
    cat/proc/$$/maps
    。然后,如果您的进程具有pid 1234,请尝试
    cat/proc/1234/maps
    和/或
    pmap 1234
    。然后您将了解共享库是如何定义的。

    通常无法将静态库链接到共享库中

    因为静态库(
    lib*.a
    )不包含(PIC),但共享库需要PIC(实际上)

    (从理论上讲,非PIC共享库是可能的;但它们包含的内容太多,以至于“共享”方面会丢失,并且会有很多工作。因此,在实践中,每个共享库都需要是PIC,以允许其在不同的进程中位于不同的地址,并且仍然保持共享)

    读德雷珀的报纸

    但是,您可以将一个共享库(例如
    libopenmp.so
    )链接到另一个库(您的共享库,请参阅)。然后,使用共享库的程序将需要
    libopenmp.so

    因此,您可以执行2或3项操作,甚至可以将库打包为适当的包(这取决于
    libopenmpi2
    Debian包)

    你可能想理解


    你应该更了解你的生活。为此,请使用和。对于第一个示例,请尝试
    cat/proc/self/maps
    cat/proc/$$/maps
    。然后,如果您的进程具有pid 1234,请尝试
    cat/proc/1234/maps
    和/或
    pmap 1234
    。然后您将了解共享库是如何定义的。

    静态地将OpenMP运行时链接到另一个共享库是一个坏主意,即使您可以实现它。如果最终代码的某些其他组件也使用OpenMP,那么在该过程中您将得到两个不同的OpenMP运行时。当每个运行时创建自己的线程池时,这会迅速导致过度订阅,从而导致性能低下。(如果您的代码假定OpenMP关键部分将保护它不受其他并行代码的影响,则可能会出现正确性故障…)


    最简单的答案可能是您的第3个问题:随代码一起提供相关OpenMP运行时共享库的副本。

    将OpenMP运行时静态链接到另一个共享库是一个坏主意,即使您可以实现它。如果最终代码的某些其他组件也使用OpenMP,那么在该过程中您将得到两个不同的OpenMP运行时。当每个运行时创建自己的线程池时,这会迅速导致过度订阅,从而导致性能低下。(如果您的代码假定OpenMP关键部分将保护它不受其他并行代码的影响,则可能会出现正确性故障…)


    最简单的答案可能是您的第3个问题:随代码一起提供相关OpenMP运行时共享库的副本。

    Thansk。那么,在2和3之间,你会选择哪种方式呢?谢谢你的线索。我会更深入地了解。你提供docker图像了吗?是的,我知道我们可以提供docker文件,其中可以包含一些安装命令,如dnf install gcc。感谢@Basile提供详细答案。谢谢。那么,在2和3之间,你会选择哪种方式呢?谢谢你的线索。我将更深入地了解。Aqre您提供docker映像吗?是的,我知道我们可以提供DockerFile,其中可以包含一些安装命令,如dnf install gcc。感谢@Basile提供详细的答案。