如何为 C++ 编写 makefile使用 Eigen 的项目,C++线性代数的模板库?
我正在利用 Eigen 库,它承诺矩阵运算的矢量化。我不知道如何使用 Eigen 中给出的文件并编写 makefile。使用 Eigen 的源文件包括下面列出的文件,这些文件甚至不是头文件(它们只是一些文本文件),
<Eigen/Core>
<Eigen/Dense>
<Eigen/Eigen>
等等。在 Eigen 的网页上,提到,为了使用它的功能,我不必构建项目,那么如何将这些文件包含在我的 makefile 中来构建我的项目。我的示例 main.c 文件如下所示。 任何人都可以告诉我如何为此文件编写 makefile makefile -
#include <Eigen/Core>
// import most common Eigen types
USING_PART_OF_NAMESPACE_EIGEN
int main(int, char *[])
{
Matrix3f m3;
m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
Matrix4f m4 = Matrix4f::Identity();
Vector4i v4(1, 2, 3, 4);
std::cout << "m3\n" << m3 << "\nm4:\n"
<< m4 << "\nv4:\n" << v4 << std::endl;
}
帮助!
I'm making use of Eigen library which promises vectorization of matrix operations. I don't know how to use the files given in Eigen and write a makefile. The source files which make use of Eigen include files as listed below, these are not even header files (They are just some text files)-
<Eigen/Core>
<Eigen/Dense>
<Eigen/Eigen>
and so on. On Eigen's webpage, it's mentioned that, in order to use its functions I don't have to build the project, then how can I include these files in my makefile to build my project. My example main.c file looks like this. Can anyone show me how to write a makefile makefile for this file -
#include <Eigen/Core>
// import most common Eigen types
USING_PART_OF_NAMESPACE_EIGEN
int main(int, char *[])
{
Matrix3f m3;
m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
Matrix4f m4 = Matrix4f::Identity();
Vector4i v4(1, 2, 3, 4);
std::cout << "m3\n" << m3 << "\nm4:\n"
<< m4 << "\nv4:\n" << v4 << std::endl;
}
Help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
根据 Eigen 网站,这是一个仅包含标头的库。
这意味着没有任何东西可以编译或链接到。相反,只要您将头文件放在标准位置(*nix/Mac 上的
/usr/local/include
),那么您所要做的就是将该位置添加到预处理器构建步骤中。假设您正在运行 *nix/Mac,并假设您已将所有内容安装到默认位置(例如
#include
引用文件/usr/local/include /Eigen/Core
),那么一个超级简单的 makefile 将如下所示:用英语表示:
main
依赖于main.cpp
main
,使用g++
main.cpp
,主
,/usr/local/include
中查找它不知道的任何标头注意:
g++
行前面有一个制表符,而不是四个空格。希望有所帮助。
According to Eigen's website, this is a header-only library.
This means there is nothing to compile or link it to. Instead, as long as you have the header files in a standard location (
/usr/local/include
on *nix/Mac), then all you have to do is add that location to your preprocessor build step.Assuming that you are running *nix/Mac, and assuming that you have everything installed to the default locations (e.g.
#include <Eigen/Core>
references the file/usr/local/include/Eigen/Core
), then a SUPER simple makefile would look like this:Which says, in English:
main
depends onmain.cpp
main
, useg++
tomain.cpp
,main
,/usr/local/include
for any headers it doesn't know aboutNOTE: there is a TAB in front of the
g++
line, NOT four spaces.Hope that helps.
他们的文档中有此内容。
看来您只需将模板(标头)文件路径添加到 Makefile 内的包含目录中即可。
They have this in their documentation .
It seems you just have to add the template(header) file path to your include directories inside your Makefile.
这些实际上是头文件。 Eigen 是一个模板库,遵循常见的模板实践包括所有头文件中的定义和声明,这与将定义和声明保存在单独文件中的非模板实践相反。当减速和定义分开时,您必须将包含定义的源文件构建到库对象文件中以链接到程序中。
表面上,这已经通过首先包含 Eigen 头文件的行为为您完成了。
只要您已将 Eigen 头文件安装到系统包含路径中,它们就会被编译到您的程序中,而无需您进行任何自定义。如果您尚未将它们安装到包含路径中,只需提供 g++ 的完整路径,如下所示...
Those are in fact header files. Eigen is a template library, and following common template practice includes definition and declaration all in header files, as apposed to non-template practice of keeping definitions and declarations in separate files. When decelerations and definitions are kept separate, you must build the source files containing definitions into library object files to be linked into your program.
This is already ostensibly done for you merely by the act of including the Eigen header files in the first place.
As long as you have installed the Eigen header files into your system include path, they will be compiled into your program without any customization on your part. If you have not installed them into your include path, simply provide the full path to g++ like so...
如果您需要一些 fortran 库,这里是我使用的命令
g++ source.cpp -o output -I/../include -L/../lib -L/../lib64 -lcholmod -lmetis -lamd -lcamd -lccolamd -lcolamd -llapack -lgfortran -lblas
我将实际路径替换为 ..
In case you need some fortran library, here is the command I use
g++ source.cpp -o output -I/../include -L/../lib -L/../lib64 -lcholmod -lmetis -lamd -lcamd -lccolamd -lcolamd -llapack -lgfortran -lblas
I replace the actual path with ..