编译包含exprTk的c ++文件时遇到麻烦

时间:2016-08-20 15:02:49

标签: c++ g++ string-parsing exprtk

我在编译包括exprtk在内的c ++代码时遇到了一些麻烦。我想编译一个包的给定示例(我称之为spark.staticfiles.StaticFilesConfiguration - Error when creating StaticResourceHandler java.io.FileNotFoundException: class path resource [static] cannot be resolved to URL because it does not exist at spark.resource.ClassPathResource.getURL(ClassPathResource.java:166) ):

parser.cpp

因此我在cmd中使用以下命令:

#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;
}

g++ -c -o parser.o -Wa,-mbig-obj -I include parser.cpp g++ -o parser.exe -s parser.o 文件位于与exprtk.hpp文件相同的包含文件夹中。

第一个问题是,parser.cpp文件非常大(~32 Mb)并且创建.exe文件需要很长时间才能中止编译。此外,如果没有parser.o标志,我会收到错误消息。此外,我认为不需要链接,因为所有代码都包含在.hpp文件中,并且没有.dll文件或其他内容。通过删除标志错误是:

-Wa,-mbig-obj

来源是通过GitHub here提供的。如果我在Makefile所在的文件夹中运行make cmd,则会出现与上面相同的错误。

我是否遗漏了某些内容,或者我是否愚蠢地正确导入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 文件?有什么建议?

1 个答案:

答案 0 :(得分:0)

你必须有-mbig-obj标志,它允许大对象文件。

正如here所述,.obj文件默认为65536个部分。

Exprtk是一个大模板重型库(hpp是1.4M),因此编译需要很长时间,并且需要在目标文件中有很多部分。