包含预编译的二进制文件与手动编译的二进制文件不同的头文件的正确方法
所以我有一个使用OpenBLAS的程序,我使用cmake来创建它。包含预编译的二进制文件与手动编译的二进制文件不同的头文件的正确方法
的问题是,我希望它顺利编译2种不同的情况:
-
对于Linux系统,比如Debian的,一个可以安装预编译
apt-get install libopenblas
,这与正常工作libopenblas
我程序。这是因为我有包括:#include <openblas/cblas.h>
现在这个选项适用于测试,而不是为了真正的交易。如果与用户编译的OpenBLAS版本一起使用,我的程序的性能会更好,因为OpenBLAS针对每台计算机(取决于处理器)进行不同的编译。但是这个预编译版本是很好的,如果你想玩这个程序。
-
对于一个版本,任何人都自己编译,一个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 <cblas.h>
但这样做是危险的,因为文件cblas.h
不仅是OpenBLAS,并可能可从BLAS的其他实现中获得。这导致文件可用,但我需要的功能openblas_set_num_threads(int num_threads);
不可用。因此,如果我默认将目录openblas
添加到我的cmake的包含列表中,如果用户没有OpenBLAS的自定义安装,则可能包含错误的文件。
所以我的问题是:你如何正确地解决这个问题,这样如果一个预编译OpenBLAS的版本不存在,然后做正确的包括不openblas
目录?
让我知道你是否需要更多的细节。
所以我找到了解决办法是使CMake的一个定义是否在本地,编译库在C++代码中发现
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()
现在,我们这样做:
#ifdef OPENBLAS_FROM_SYSTEM
#include <openblas/cblas.h>
#else
#include "include/cblas.h"
#endif
第一版本是当没有找到OpenBLAS时,它是默认的Debian包含。另一种情况是,如果发现OpenBLAS。这将包括正确的文件。