【问题标题】:Cygwin - gcc compilation of symengine error using make - variadic templatesCygwin - gcc 使用 make 编译 symengine 错误 - 可变参数模板
【发布时间】:2016-06-05 05:44:46
【问题描述】:

我通常不会因为这样的问题打扰人们,但我一直在毫无结果地谷歌搜索没有结果。 我正在通过 cygwin 将 symengine 安装到我的计算机上,并且说明告诉您执行“cmake”。然后'制作'

/cygdrive/c/SDPB/sym/symengine/symengine_rcp.h:294:32: warning: variadic templates only available with -std=c++11 or -std=gnu++11
template<typename T_, typename ...Args>
                        ^
/cygdrive/c/SDPB/sym/symengine/symengine_rcp.h:295:37: error: expected ‘,’ or ‘...’ before ‘&&’ token
friend inline RCP<T_> make_rcp( Args&& ...args );
                             ^
/cygdrive/c/SDPB/sym/symengine/symengine_rcp.h:295:48: error: parameter packs not expanded with ‘...’:
friend inline RCP<T_> make_rcp( Args&& ...args );

我意识到这可能是一个非常具体的错误,而不是一个常见问题,但我想知道如何在这种情况下通过 make 启用 c++11 或 gnu++11? 提前谢谢!

【问题讨论】:

  • 我很确定这不是缺少 c++11 标志,因为它在他们自己的文件中使用,因此 cmake 应该将正确的编译器标志放在 Makefile 中。就像你写g++ -o output.o -c source.c一样,如果你想要c++11,你会写g++ -std=c++11 -o output.o -c source.c。这必须写在 Makefile 中,不能作为命令参数传递。
  • 这是有道理的,但是我不知道我必须去哪里编辑它。在 Makefile 中没有任何地方说 g++。我唯一能想到的地方是# target to build an object file symengine_rcp.o: $(MAKE) -f CMakeFiles/symengine.dir/build.make CMakeFiles/symengine.dir/symengine_rcp.o .PHONY : symengine_rcp.o,当我转到 build.make 文件时,同样的问题仍在继续,我不知道该去哪里了。感谢您抽出宝贵时间回复!
  • 一般在高级 Makefile 中,都是在变量中定义命令名和目录/文件,所以如果需要更改编译器/目录/文件,只需更改一次。对于编译器,变量名通常是CCCXX。但是,cmake文件生成了主makefile调用的子makefile(根据我对您给出的行的理解,这似乎是正确的)。对于 c++11 标志,也有一个变量:对于 C,它是 CFLAGS,对于 C++,它是 CXXFLAGS。如果它被定义,它应该在那里。

标签: c++11 gcc makefile cygwin variadic-templates


【解决方案1】:

要在 cmake 步骤中添加标志,请先删除 CMakeCache.txt 然后再做

CXXFLAGS=-std=c++11 cmake .

要在制作步骤中添加标志,您可以这样做,

make CXX_DEFINES=-std=c++11

我在这里打开了一个问题,https://github.com/symengine/symengine/issues/826。如果您可以在此处发布 CMake 输出,我们可以在 SymEngine 本身中解决此问题。

【讨论】:

  • 非常感谢,这正是我遇到的问题。
【解决方案2】:

它可能被实现为 cmake 定义,请查看文档。例如,在某些 C++ 工具包 Geant 中记录了选项 -DGEANT4_BUILD_CXXSTD=ON|OFF (默认为 OFF。)当您将此选项传递给 cmake 时

> cmake -DGEANT4_BUILD_CXXSTD=ON

然后生成的 makefile 将包含选项 -std=c++11

另一种选择是将它传递给make

> make CXXFLAGS=-std=c++11

最后一个选项是打开 makefile 并检查它是否包含 CXXFLAGS 一些可以更改的定义,例如

> make CXXADDON=-std=c++11

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2016-08-09
    • 2014-02-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多