正确的方式包含与预编译的二进制文件和手动编译的二进制文件不同的头文件

量子物理学家

因此,我有一个使用OpenBLAS的程序,并且使用cmake来制作它。

问题是我希望它能在2种不同情况下顺利编译:

  1. 对于Linux系统,Debian的说,一个可以安装预编译的libopenblasapt-get install libopenblas,这与我的程序工作正常。这是因为我有包括:

    #include <openblas/cblas.h>
    

现在,此选项适用于测试,不适用于真正的交易。如果与用户编译的OpenBLAS版本一起使用,我的程序的性能会更好,因为OpenBLAS对于每台计算机(取决于处理器)的编译方式都不同。但是,如果您想使用该程序,则此预编译版本很好。

  1. 对于任何人自己编译的版本,OpenBLAS安装的结构为:

    ├── bin
    ├── include
    │   ├── cblas.h
    │   ├── f77blas.h
    │   ├── lapacke_config.h
    │   ├── lapacke.h
    │   ├── lapacke_mangling.h
    │   ├── lapacke_utils.h
    │   └── openblas_config.h
    └── lib
        ├── libopenblas.a -> libopenblas_haswellp-r0.2.19.a
        ├── libopenblas_haswellp-r0.2.19.a
        ├── libopenblas_haswellp-r0.2.19.so
        ├── libopenblas.so -> libopenblas_haswellp-r0.2.19.so
        └── libopenblas.so.0 -> libopenblas_haswellp-r0.2.19.so
    

如您所见,这里没有名为“ openblas”的目录,这意味着我的include应该是:

#include <cblas.h>

但是这很危险,因为该文件cblas.h不仅适用于OpenBLAS,而且可以从BLAS的其他实现中获得。这导致文件可用,但是我需要的功能openblas_set_num_threads(int num_threads);不可用。因此,如果我默认情况下将目录添加openblas到我的cmake的包含列表中,那么如果用户没有自定义安装的OpenBLAS,则可能包含错误的文件。

所以我的问题是:您将如何正确处理此问题,以便如果不存在OpenBLAS的预编译版本,那么在没有openblas目录的情况下进行正确的包含吗?

如果您需要更多详细信息,请告诉我。

量子物理学家

所以我发现的解决方案是,如果找到了本地编译库,则在cmake中进行定义

if(${foundOpenBLAS})
    message("I found OpenBLAS that you compiled.")
    TARGET_LINK_LIBRARIES(mylibs -L"${OpenBLASPath}/lib")
else()
    message("I couldn't find OpenBLAS that you compiled, so I'm assuming that you have it installed in your system.")
    add_definitions(-DOPENBLAS_FROM_SYSTEM)
endif()

现在,在C ++代码中,我们执行以下操作:

#ifdef OPENBLAS_FROM_SYSTEM
#include <openblas/cblas.h>
#else
#include "include/cblas.h"
#endif

第一个版本是找不到OpenBLAS的版本,它是默认的Debian include。另一种情况是找到OpenBLAS。这将包括正确的文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linux内核手动构建:生成的二进制文件比预编译的二进制文件大10倍

来自分类Dev

在源代码和预编译的二进制文件之间切换

来自分类Dev

下载预编译的二进制文件 libtensorflow.so 和 libtensorflow_framework.so

来自分类Dev

CMake:手动设置MPI标头和二进制文件的路径

来自分类Dev

g ++编译的二进制文件给出“无法执行二进制文件”

来自分类Dev

yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

来自分类Dev

在本地为SBT发布预编译的X二进制文件

来自分类Dev

为什么许多项目不提供预编译的二进制文件?

来自分类Dev

snapcraft.yaml语法,用于预编译的二进制文件

来自分类Dev

我在哪里存储预编译的二进制文件?

来自分类Dev

用不同的C ++编译器构建的二进制文件和库如何兼容?

来自分类Dev

是否可以优化已编译的二进制文件?

来自分类Dev

从编译的二进制文件中获取golang版本

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

在Eclipse SIGSEV中编译C二进制文件

来自分类Dev

显示从哪个git commit编译二进制文件

来自分类Dev

使用go动态创建编译的二进制文件

来自分类Dev

无法执行刚刚编译的二进制文件

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

无法执行刚刚编译的二进制文件

来自分类Dev

使用VexCL“编译二进制文件”

来自分类Dev

编译后更改二进制文件目录

来自分类Dev

将编译时间信息嵌入二进制文件

来自分类Dev

如何卸载自编译二进制文件?

来自分类Dev

VS 编译的二进制文件中的符号

来自分类Dev

Shellcode和二进制文件

来自分类Dev

二进制文件如何“二进制”?

来自分类Dev

C通过二进制文件生成头文件

来自分类Dev

编译二进制

Related 相关文章

  1. 1

    Linux内核手动构建:生成的二进制文件比预编译的二进制文件大10倍

  2. 2

    在源代码和预编译的二进制文件之间切换

  3. 3

    下载预编译的二进制文件 libtensorflow.so 和 libtensorflow_framework.so

  4. 4

    CMake:手动设置MPI标头和二进制文件的路径

  5. 5

    g ++编译的二进制文件给出“无法执行二进制文件”

  6. 6

    yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

  7. 7

    在本地为SBT发布预编译的X二进制文件

  8. 8

    为什么许多项目不提供预编译的二进制文件?

  9. 9

    snapcraft.yaml语法,用于预编译的二进制文件

  10. 10

    我在哪里存储预编译的二进制文件?

  11. 11

    用不同的C ++编译器构建的二进制文件和库如何兼容?

  12. 12

    是否可以优化已编译的二进制文件?

  13. 13

    从编译的二进制文件中获取golang版本

  14. 14

    编译的Elf二进制文件太大

  15. 15

    在Eclipse SIGSEV中编译C二进制文件

  16. 16

    显示从哪个git commit编译二进制文件

  17. 17

    使用go动态创建编译的二进制文件

  18. 18

    无法执行刚刚编译的二进制文件

  19. 19

    编译的Elf二进制文件太大

  20. 20

    无法执行刚刚编译的二进制文件

  21. 21

    使用VexCL“编译二进制文件”

  22. 22

    编译后更改二进制文件目录

  23. 23

    将编译时间信息嵌入二进制文件

  24. 24

    如何卸载自编译二进制文件?

  25. 25

    VS 编译的二进制文件中的符号

  26. 26

    Shellcode和二进制文件

  27. 27

    二进制文件如何“二进制”?

  28. 28

    C通过二进制文件生成头文件

  29. 29

    编译二进制

热门标签

归档