2016-11-15 84 views
0

所以我有一個使用OpenBLAS的程序,我使用cmake來創建它。包含預編譯的二進制文件與手動編譯的二進制文件不同的頭文件的正確方法

的問題是,我希望它順利編譯2種不同的情況:

  1. 對於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目錄?

    讓我知道你是否需要更多的細節。

    回答

    1

    所以我找到了解決辦法是使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。這將包括正確的文件。

    相關問題