你如何为 clang 和 gcc 编写一个 makefile?

新手上路,请多包涵

我想在我的代码中使用 std::experimental::filesystem ,这需要我使用 -lstdc++fs-lc++experimental 和 Clang 进行编译。目前我有一个 makefilemakefile.clang 反映了编译的差异,或者我考虑过使用clang构建目标,所以我可以运行 build clang

是否有一些规范的方法可以在生成文件中设置特定于编译器的标志?

原文由 shians 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

正如用户“一些程序员老兄”所提到的,GNU make 中 有条件。您可以通过这种方式轻松检查编译器版本:

 CXXFLAGS = -Og -Wall -Wextra

GCC_CXXFLAGS = -DMESSAGE='"Compiled with GCC"'
CLANG_CXXFLAGS = -DMESSAGE='"Compiled with Clang"'
UNKNOWN_CXXFLAGS = -DMESSAGE='"Compiled with an unknown compiler"'

ifeq ($(CXX),g++)
  CXXFLAGS += $(GCC_CXXFLAGS)
else ifeq ($(CXX),clang)
  CXXFLAGS += $(CLANG_CXXFLAGS)
else
  CXXFLAGS += $(UNKNOWN_CXXFLAGS)
endif

给定以下源文件 test.cpp 您可以使用 make CXX=g++ testmake CXX=clang test 编译它,并且它应该将适当的标志传递给每个编译器。

 #include <iostream>

int main() {
  std::cout << "Hello World " << MESSAGE << std::endl;
  return 0;
}

原文由 PaulR 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 CMake 来实现这一点。如果您想拥有可移植的代码,最好使用它。

CMake 允许生成适合您系统的 Makefile(例如您的系统默认编译器)。 CMake 有很多功能对于检查实际系统配置非常有用。

在这个答案中,您有示例如何做到这一点: 在 cmake 中,我如何测试编译器是否是 Clang?

一个可靠的检查是使用 CMAKE__COMPILER_ID 变量。例如,检查 C++ 编译器:

 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  # using Clang
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  # using GCC
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  # using Intel C++
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  # using Visual Studio C++
endif()

如果您仍想使用 Makefile,您应该检查此答案: https ://stackoverflow.com/a/2826178/7042963

原文由 BartekPL 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题