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

量子物理学家

因此,我有一个使用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 条评论
登录 后参与评论

相关文章

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

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

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

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

µWebSockets的编译失败,并且没有预编译的二进制文件

在预编译阶段编译的二进制文件不适用于临时容器

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

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

将预编译的二进制文件捆绑到电子应用程序中

Prometheus用于Mac OS X的预编译二进制文件

使用Linux预编译二进制文件的Java / JNI的Vowpal wabbit

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

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

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

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

qemu-arm运行编译的二进制文件

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

检查二进制文件是否用“ -static”编译

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

使用NDK 13编译独立的二进制文件

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

编译的Elf二进制文件太大

将ffmpeg编译为独立的二进制文件

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

TensorFlow二进制文件未编译

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

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

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

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

TOP 榜单

热门标签

归档