如何运行这个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)

2023-04-18by@biteasquirrel-h3jPZ&@ChatGPT.Model: gpt-3.5
biteasquirrel-h3jPZ

如何运行这个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)

Avatar
Avatar
  1. 打开终端,进入Makefile所在的目录。
  2. 输入命令 "make" 即可运行该Makefile,生成可执行文件 "TDFEasyDemo"。如果要清除生成的目标文件和可执行文件,可以输入命令 "make clean"。
biteasquirrel-h3jPZ

/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:30: error: expected initializer before ‘noexcept’
34 | extern __pid_t gettid (void) __THROW;
| ^~~~~~~

Avatar
Avatar

这个错误提示是因为代码中使用了C++11的关键字 "noexcept",而编译器可能不支持C++11标准。解决方法有两种:

  1. 修改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)

  2. 修改代码,将使用了C++11特性的代码修改成不依赖于C++11的代码。例如,将关键字 "noexcept" 改为 "__THROW"。

biteasquirrel-h3jPZ

/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:30: error: expected initializer before ‘noexcept’
34 | extern __pid_t gettid (void) __THROW;
|

Avatar
Avatar

这个错误提示是因为代码中使用了C++11的关键字 "noexcept",而编译器可能不支持C++11标准。解决方法有两种:

  1. 修改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)

  2. 修改代码,将使用了C++11特性的代码修改成不依赖于C++11的代码。例如,将关键字 "noexcept" 改为 "__THROW"。

biteasquirrel-h3jPZ

apt install make
apt install make-guile

Ask your administrator to install one of them.

Avatar
Avatar

这个错误提示是因为你的系统缺少 "make" 或 "make-guile" 工具,需要管理员安装它们。你可以尝试使用以下命令安装:

  • 对于Debian/Ubuntu系统:sudo apt-get install make
  • 对于Fedora系统:sudo dnf install make
  • 对于CentOS/RHEL系统:sudo yum install make

如果以上命令不能成功安装make,请尝试安装make-guile:

  • 对于Debian/Ubuntu系统:sudo apt-get install make-guile
  • 对于Fedora系统:sudo dnf install make-guile
  • 对于CentOS/RHEL系统:sudo yum install make-guile

请注意,你需要管理员权限才能安装这些软件包。如果你没有管理员权限,请联系系统管理员协助安装。

Avatar

你可以在终端中输入以下命令查看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,你的系统上可能会有不同的版本。

biteasquirrel-h3jPZ

编译makefile需要安装make吗

Avatar
Avatar

是的,编译Makefile需要安装make工具。Makefile是用来描述如何编译和链接程序的文件,但是它本身并不能直接编译代码。make工具可以根据Makefile中的规则和指令来自动编译和链接程序。因此,如果你要编译Makefile中描述的程序,需要先确保make工具已经安装在你的系统中。

biteasquirrel-h3jPZ

./include/TDFDataDefine.h:1505:11: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
return "";
^~

Avatar
Avatar

这个警告是因为代码中将一个字符串常量转换为了非 const 的 char 指针,这在标准 C++ 中是不允许的。在 C++11 中,字符串字面值之所以能转换为非 const 的 char 指针,是因为引入了 "user-defined literals" 特性。但是,在不支持 C++11 的编译器中,这样的转换会被认为是不合法的。

解决这个警告的方法是将返回值修改为 const char* 类型,例如:

const char* get_string() {
    return "hello";
}

修改代码后重新编译即可。