【问题标题】:troubles with compiling a c++ file including exprTk编译包含 exprTk 的 c++ 文件时遇到的问题
【发布时间】:2016-12-27 14:07:42
【问题描述】:

我在编译包括 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 here 提供。如果我在 Makefile 所在的文件夹中的 cmd 中运行 make,也会出现与上述相同的错误。

正确导入exprtk.hpp 文件是我遗漏了什么还是我太愚蠢了?有什么建议?

【问题讨论】:

  • 具体是什么错误?链接器错误?
  • 如果我放弃它显示too many sections 的标志并且它无法关闭 .o 文件,因为它太大了。使用该标志不会发生错误,但从 .o 文件到 .exe 文件的编译不会完成。我认为不需要链接,因为所有内容都包含在 .hpp 文件中。
  • 通过添加附加信息改进您的问题请求。评论并没有真正的用处。

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


【解决方案1】:

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

正如here 解释的那样,.obj 文件默认有 65536 个部分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多