我在编译包括 exprtk 在内的 c++ 代码时遇到了一些麻烦。我想编译一个给定的包示例(我称之为parser.cpp
):
#include <cstdio>
#include <string>
#include "exprtk.hpp"
template <typename T>
void trig_function()
{
typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
T x;
symbol_table_t symbol_table;
symbol_table.add_variable("x",x);
symbol_table.add_constants();
expression_t expression;
expression.register_symbol_table(symbol_table);
parser_t parser;
parser.compile(expression_string,expression);
for (x = T(-5); x <= T(+5); x += T(0.001))
{
T y = expression.value();
printf("%19.15f\t%19.15f\n",x,y);
}
}
int main()
{
trig_function<double>();
return 0;
}
因此,我在 cmd 中使用以下命令:
g++ -c -o parser.o -Wa,-mbig-obj -I include parser.cpp
g++ -o parser.exe -s parser.o
该exprtk.hpp
文件位于与该文件相同的目录中的包含文件夹中parser.cpp
。
第一个问题是,parser.o
文件非常大(~ 32 Mb),创建 .exe 文件需要很长时间,以至于我中止了编译。此外,如果没有-Wa,-mbig-obj
标志,我会收到错误消息。另外我认为不需要链接,因为所有代码都包含在 .hpp 文件中,并且没有 .dll 文件或其他文件。通过删除标志,错误是:
C:/Rtools/mingw_64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.3/../../../../x86_64-w64-mingw32/bin/as.exe:
parser.o: too many sections (88691)
C:\..\AppData\Local\Temp\ccE7ythI.s: Assembler messages:
C:\..\AppData\Local\Temp\ccE7ythI.s: Fatal error: can't write parser.o: File too big
C:/Rtools/mingw_64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.3/../../../../x86_64-w64-mingw32/bin/as.exe: parser.o:
too many sections (88691)
C:\..\AppData\Local\Temp\ccE7ythI.s: Fatal error:
can't close parser.o: File too big
源代码在此处通过 GitHub 提供。如果我在 Makefile 所在文件夹中的 cmd 中运行 make ,则会发生与上述相同的错误。
我错过了什么还是我exprtk.hpp
正确导入文件太愚蠢了?有什么建议么?