我想在代码中使用std::experimental::filesystem
,这需要我在GCC中使用-lstdc++fs
,在Clang中使用-lc++experimental
。目前,我有一个makefile
和makefile.clang
反映了编译上的差异,或者我考虑过使用clang构建目标,以便可以运行build clang
。
是否有一些规范的方法可以在makefile中设置特定于编译器的标志?
答案 0 :(得分:5)
正如用户“ Some developer dude”所述,GNU make中有conditionals。您可以通过以下方式轻松检查编译器版本:
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++ test
或make CXX=clang test
对其进行编译,并且应将适当的标志传递给每个编译器。
#include <iostream>
int main() {
std::cout << "Hello World " << MESSAGE << std::endl;
return 0;
}
答案 1 :(得分:2)
您可以使用CMake来实现。如果您想拥有可移植的代码,则最好使用。
CMake允许生成适合您的系统的Makefile(例如,系统默认编译器)。 CMake具有许多功能,这些功能对于检查实际系统配置非常有用。
在此答案中,您示例了如何执行此操作:In cmake, how can I test if the compiler is 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
答案 2 :(得分:0)
要处理版本化的编译器(如您在接受的答案的注释中提到的那样),您需要这样使用$(findstring find,in)
:
# Detect if CXX is g++ or clang++, in this order.
ifeq '' '$(findstring clang++,$(CXX))'
LDLIBS = -lstdc++fs
else
LDLIBS = -lc++experimental
endif
这里的警告是您不能使用$(findstring g++,$(CXX))
,因为它会无意中匹配clang++
。
更深入地处理事情的替代方案是:
# Detect if CXX is clang++ or g++, in this order.
ifneq '' '$(findstring clang++,$(CXX))'
LDLIBS = -lc++experimental
else ifneq '' '$(findstring g++,$(CXX))'
LDLIBS = -lstdc++fs
endif