我在做什么 我正在编写一个依赖于 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
。
这样做的好做法是什么?谢谢!
最佳答案
我将列出我想到的 2 种不同的方法。
1、在函数定义中使用ifdefs即可。这将保持统一的接口(interface),每个人都可以调用它。
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 ..
- 第二种方法将基于图书馆方法。您可以为不同的系统编译单独的实现库。然后在链接时,您可以选择要使用的静态库(或在运行时选择动态库)。很可能你只会交付在目标系统上工作的库,什么都不会。如果你选择的话,你可能不用 #ifdefs 就可以逃脱,只是在不同的文件中有不同的实现>
系统1.cpp
string probe(string &) { return do_probe();}
gcc sys1.cpp -o sys1.so -shared
系统2.cpp
string probe(string &) {cerr << messate; return "";}
gcc sys2.cpp -o sys2.so -shared
现在您只需将正确的库(sys1 或 sys2)传送到正确的系统。或您程序的正确静态链接图像。
有多种方法可以使用条件编译来做到这一点。所以你决定。
关于c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038192/