【发布时间】:2015-03-03 16:53:34
【问题描述】:
- 语言:C
- 操作系统:红帽 EL
以“例如”开头:
- 假设我有两个库:
libJUMP.so和libSIT.so。 - JUMP 包含函数
jump(),同样 SIT 包含函数sit() - 我有一个应用程序想提供给不同的人;他们可以获得
jump()功能、sit()功能,或两者兼而有之。但是,如果可能的话,我想不使用#ifdef。
libJUMP.so 的标题:
#ifndef JUMP_H_
#define JUMP_H_
#define JUMP_ENABLED
void jump();
#endif /* JUMP_H_ */
libSIT.so 的标题:
#ifndef SIT_H_
#define SIT_H_
#define SIT_ENABLED
void sit();
#endif /* SIT_H_ */
我有一个应用程序:
#include "jump.h"
#include "sit.h"
int main()
{
// #ifdef JUMP_ENABLED
jump();
// #endif /* JUMP_ENABLED */
// #ifdef SIT_ENABLED
sit();
// #endif /* SIT_ENABLED */
}
所以:
- 有没有办法在不使用
#ifdef的情况下做到这一点?有没有更好的方法?- 我听说我们可以通过编译两个 SO 库来做到这一点,如果在目标系统上运行应用程序时缺少一个,它可以自动排除该功能(使用
dlopen()和 @987654336 的某种组合@?) 任何简单的例子,如果这确实是正确的?如果可能的话,我上面的代码的一个例子:D?
- 我听说我们可以通过编译两个 SO 库来做到这一点,如果在目标系统上运行应用程序时缺少一个,它可以自动排除该功能(使用
如果这是一个愚蠢的问题,或者根本不可能,请随时告诉我。如果有类似的问题会被视为重复,请告诉我,我将删除此帖子。
【问题讨论】:
-
我会创建一个新的#define,例如
JUMP_OR_SIT,它可以是jump或sit。 -
this 有帮助吗?
-
首先,您给出的示例过于模糊,无法推荐可靠的解决方案。如果编译时检查没问题,您的答案可能是 autoconf。它可以检查现有库并将适当的
defines 放入配置头文件中。 Linux Kernel Development book 建议尽可能避免ifdef内部函数。在您的情况下,如果未定义SIT_ENABLED,本书建议定义一个空的坐函数,并且您仍然可以在任何地方调用坐。 -
@meaning-matters 很遗憾没有。它谈到了
darwin,这很好,因为我认为苹果 gcc 和标准 gcc 之间会有一些相似之处。然而,他所说的只是剥离符号,而不是在运行时启用或禁用某些功能。 -
@holgac 这是我的目标——在函数中避免
#ifdef。我会调查autoconf。我试图让这个例子简短——如果它含糊不清,对不起。我可以添加更多所需的详细信息。我的最终目标是让某些功能在运行时可用(或不可用),如果这样更有意义?
标签: c linux shared-libraries dynamic-linking