在C项目中使用特征

时间:2014-11-12 14:17:27

标签: c++ c include eigen

我正在研究从互联网上获得的一个C项目,我正在尝试为涉及线性代数的项目添加一些函数。在我之前的C ++作品中,我通常依赖于Eigen进行线性代数。

有没有办法将Eigen用于C项目?如果是的话,我该怎么做才能做到这一点? (简单地添加Eigen头文件是不够的,因为例如标准C ++文件不会自动包含在内)

1 个答案:

答案 0 :(得分:8)

Eigen是一个大量使用C语言中不存在的C ++特性的库。因此,它不能直接在C翻译单元中使用。

但是,您可以使用Eigen将部件包装在单独的共享库中并公开C接口。这是一个如何编写这样一个库的小例子。

图书馆界面

/* foo.h */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

void foo(int arg);

#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */

默认情况下,C ++对导出函数的名称使用与C不同的修改规则。我们使用extern "C"来指示C ++编译器使用C规则。因为C ++和C编译器都会看到接口文件,所以我们将extern声明包装在#ifdef中,这只会触发C ++编译器。

图书馆实施

/* foo.cpp */

#include "foo.h"

#include <iostream>

extern "C" {

void foo(int arg) {
  std::cout << arg << std::endl;
}

} /* extern "C" */

我们还需要在接口的定义中定义C链接。除此之外,您可以在实现中使用您喜欢的任何C ++特性(包括Eigen)。

C项目

/* main.c */

#include "foo.h"

int main() {
  foo(42);
  return 0;
}

包含接口标头并像使用任何其他C库一样使用它。

建筑

$ g++ foo.cpp -shared -fPIC -o libfoo.so
$ gcc main.c -L. -lfoo -o main

使用C ++编译器构建共享库libfoo.so。使用C编译器构建主程序,链接到共享库。确切的构建步骤可能因编译器/平台而异。