如何运行这个makefile:
CC = gcc
CXX = g++
#TRDIR=/usr/include/c++/4.1.2/tr1
INCLUDES=-I. -I./include -I./include/tdcore
CFLAGS = -DNDEBUG -DNOCPP11 -DAPR_DECLARE_STATIC -DTD_STATIC -D__LINUX -D__NEWCOMPRESS -fPIC -fvisibility=hidden -pthread $(INCLUDES)
LIBFLAGS = -DAPR_DECLARE_STATIC -DTD_STATIC -D__LINUX -D__NEWCOMPRESS -pthread -fPIC -fvisibility=hidden -lrt -L./ -lTDFAPI30
LIBTARGET = TDFEasyDemo
STATICLIBS =
SOURCES = $(wildcard ./*.cpp)
OBJS = (patsubst %.c,%.o,(patsubst %.cpp,%.o,(patsubst %.cc,%.o,(SOURCES))))
%.o:%.cpp
$(CXX) $(CFLAGS) -c $< -o $@
$(LIBTARGET) : $(OBJS)
$(CXX) $(LIBFLAGS) -o $@ $^
clean:
rm -rf *.o
rm $(LIBTARGET)
/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:30: error: expected initializer before ‘noexcept’
34 | extern __pid_t gettid (void) __THROW;
| ^~~~~~~
这个错误提示是因为代码中使用了C++11的关键字 "noexcept",而编译器可能不支持C++11标准。解决方法有两种:
修改Makefile,在CFLAGS中添加 "-std=c++11",指定编译器使用C++11标准进行编译。例如:CFLAGS = -std=c++11 -DNDEBUG -DNOCPP11 -DAPR_DECLARE_STATIC -DTD_STATIC -D__LINUX -D__NEWCOMPRESS -fPIC -fvisibility=hidden -pthread $(INCLUDES)
修改代码,将使用了C++11特性的代码修改成不依赖于C++11的代码。例如,将关键字 "noexcept" 改为 "__THROW"。
/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:30: error: expected initializer before ‘noexcept’
34 | extern __pid_t gettid (void) __THROW;
|
这个错误提示是因为代码中使用了C++11的关键字 "noexcept",而编译器可能不支持C++11标准。解决方法有两种:
修改Makefile,在CFLAGS中添加 "-std=c++11",指定编译器使用C++11标准进行编译。例如:CFLAGS = -std=c++11 -DNDEBUG -DNOCPP11 -DAPR_DECLARE_STATIC -DTD_STATIC -D__LINUX -D__NEWCOMPRESS -fPIC -fvisibility=hidden -pthread $(INCLUDES)
修改代码,将使用了C++11特性的代码修改成不依赖于C++11的代码。例如,将关键字 "noexcept" 改为 "__THROW"。
apt install make
apt install make-guile
Ask your administrator to install one of them.
这个错误提示是因为你的系统缺少 "make" 或 "make-guile" 工具,需要管理员安装它们。你可以尝试使用以下命令安装:
如果以上命令不能成功安装make,请尝试安装make-guile:
请注意,你需要管理员权限才能安装这些软件包。如果你没有管理员权限,请联系系统管理员协助安装。
查看g++
你可以在终端中输入以下命令查看g++版本:
g++ --version
执行命令后,终端会输出g++的版本信息,例如:
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
这里的版本号是9.3.0,你的系统上可能会有不同的版本。
编译makefile需要安装make吗
是的,编译Makefile需要安装make工具。Makefile是用来描述如何编译和链接程序的文件,但是它本身并不能直接编译代码。make工具可以根据Makefile中的规则和指令来自动编译和链接程序。因此,如果你要编译Makefile中描述的程序,需要先确保make工具已经安装在你的系统中。
./include/TDFDataDefine.h:1505:11: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
return "";
^~
这个警告是因为代码中将一个字符串常量转换为了非 const 的 char 指针,这在标准 C++ 中是不允许的。在 C++11 中,字符串字面值之所以能转换为非 const 的 char 指针,是因为引入了 "user-defined literals" 特性。但是,在不支持 C++11 的编译器中,这样的转换会被认为是不合法的。
解决这个警告的方法是将返回值修改为 const char* 类型,例如:
const char* get_string() {
return "hello";
}
修改代码后重新编译即可。