[英]Using Eigen in a C Project
我正在研究從互聯網上獲得的一個C項目,我正在嘗試為涉及線性代數的項目添加一些函數。 在我以前的C ++工作中,我通常依賴Eigen進行線性代數。
有沒有辦法將Eigen用於C項目? 如果是的話,我該怎么做才能做到這一點? (簡單地添加Eigen頭文件是不夠的,因為例如標准C ++文件不會自動包含)
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編譯器都會看到接口文件,所以我們將#ifdef
的extern
聲明包裝起來,這只會觸發C ++編譯器。
/* foo.cpp */
#include "foo.h"
#include <iostream>
extern "C" {
void foo(int arg) {
std::cout << arg << std::endl;
}
} /* extern "C" */
我們還需要在接口的定義中定義C鏈接。 除此之外,您可以在實現中使用您喜歡的任何C ++功能(包括Eigen)。
/* 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編譯器構建主程序,鏈接到共享庫。 確切的構建步驟可能因編譯器/平台而異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.