9

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それともファイルを正しくインポートするのが愚かすぎるのでしょうか? 助言がありますか?

4

1 に答える 1