簡體   English   中英

在C項目中使用特征

[英]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編譯器都會看到接口文件,所以我們將#ifdefextern聲明包裝起來,這只會觸發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編譯器構建主程序,鏈接到共享庫。 確切的構建步驟可能因編譯器/平台而異。

暫無
暫無

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

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