簡體   English   中英

如何基於預處理器定義的宏關閉C ++庫的子模塊

[英]How to turn off submodule of a C++ library based on preprocessor defined macro

我在做什么,我正在編寫一個依賴NetCDF庫的C ++庫。 例如,

include <netcdf>
class myLib {
    public:

        myLib();
        myLib(const myLib&);
        virtual ~myLib();

        std::string probe_data(std::string & file_path);
        ...

函數probe_data使用NetCDF庫中的函數。

我定義了預處理程序宏CANALOGSIO_WITHOUT_NETCDF 是什么問題 因為在某些系統中,沒有安裝NetCDF庫。 因此,我想在我的庫中關閉此功能,例如,該庫仍將具有probe_data函數,但它只會返回NetCDF not installed

這樣做的一個好習慣是什么? 謝謝!

我將為此列出兩種不同的方法。

1,只需在函數定義中使用ifdefs。 這將保持統一的界面,每個人都可以調用它。

class myLib {

    ...
    std::string probe_data(std::string & file_path) {
       #ifdef NETCDF
         return do_real_probe(file_pat);
       #else
         cerr << "NOt implemented function" << endl;
         return "";
       #endif
     }

    ...

這需要對單獨的系統進行單獨的編譯。 您需要在編譯命令行中提供宏的定義,即使用gcc:

g++ -DNETCDF ..
  1. 第二種方法將基於庫方法。 您可以為不同的系統編譯單獨的實現庫。 然后,在鏈接時,您可以選擇要使用的靜態庫(對於動態庫,則在運行時)。 您最有可能只會交付在目標系統上工作的庫,而不會做任何事情。 如果選擇的話,可能沒有#ifdefs就逃脫了,只是在不同的文件中有不同的實現>

sys1.cpp

 string probe(string &) { return do_probe();}
 gcc sys1.cpp -o sys1.so -shared

sys2.cpp

 string probe(string &) {cerr << messate; return "";}
 gcc sys2.cpp -o sys2.so -shared

現在,您只需要將正確的庫(sys1或sys2)傳遞到正確的系統即可。 或正確的程序靜態鏈接映像。

有多種使用條件編譯的方法。 所以你決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM