【问题标题】:How to create Makefile with includes and libraries?如何使用包含和库创建 Makefile?
【发布时间】:2020-08-10 14:45:18
【问题描述】:

我正在尝试为我的 C++ 项目创建 Makefile。

我的main.cpp 包含此自定义包括:

#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

对于我使用的编译:

g++ -stdlib=libc++ -o app.cgi -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc -L/usr/local/mysql-connector-c++/lib64 main.cpp -lmysqlcppconn

现在我需要添加

#include "tinyxml2/tinyxml2.hpp"

最简单的方法是创建Makefile。我写道:

CC = g++

CFLAGS = -Wall -g -std=c++11

INCLUDES = -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc

LDLIBS = -L/usr/local/mysql-connector-c++/lib64 -lmysqlcppconn

SRCS = main.cpp ./tinyxml2/tinyxml2.cpp 

OBJS = $(SRCS:.cpp=.o)

MAIN = main.cgi

#
# The following part of the makefile is generic
#

.PHONY: depend clean

all:    $(MAIN)

$(MAIN): $(OBJS) 
        $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)

.PRECIOUS: %.o

.c.o:
        $(CC) $(CFLAGS) $(INCLUDES) -cpp $<  -o $@

clean:
        $(RM) *.o *~ $(MAIN)

depend: $(SRCS)
        makedepend $(INCLUDES) $^

我收到错误:

main.cpp:21:10: fatal error: 'mysql_connection.h' file not found
#include <mysql_connection.h>

如何为每个.o 添加包含? tinyxml2 不使用 MySQL 连接器,所以我不应该添加 -lmysqlcppconn。怎么做?

【问题讨论】:

  • 为什么要将jdbc添加到mysql连接器?
  • cppconn 文件隐藏在那里。
  • 我无法在$(CC) $(CFLAGS) $(INCLUDES) -cpp $&lt; -o $@ 中找到有关参数-cpp 的信息。这是什么意思? "$&lt; 是一个宏,引用了第一个依赖" en.wikipedia.org/wiki/Makefile 但是.c.o: 没有任何依赖。
  • 你为什么在g++ -stdlib=libc++ -o app.cgi -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc -L/usr/local/mysql-connector-c++/lib64 main.cpp -lmysqlcppconn中使用-stdlib=libc++
  • makefile 中没有任何内容告诉它在编译 cpp 文件时使用 $(INCLUDES)。所以,它没有。

标签: c++ mysql c makefile


【解决方案1】:

您可以逐步构建生成文件。从 build 命令开始,使其成为 makefile 目标(我删除了-stdlib=libc++):

app.cgi: main.cpp
    g++ -o app.cgi -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc -L/usr/local/mysql-connector-c++/lib64 main.cpp -lmysqlcppconn

接下来您可以将大部分元素提取到变量中并添加编译器标志:

CXX = g++
CXXFLAGS = -Wall -g -std=c++11
MAIN = app.cgi
CPPFLAGS = -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc
SRCS = main.cpp
LDFLAGS = -L/usr/local/mysql-connector-c++/lib64
LDLIBS = -lmysqlcppconn

$(MAIN): $(SRCS)
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(SRCS) $(LDFLAGS) $(LDLIBS)

添加一个clean 和一个all 目标:

CXX = g++
CXXFLAGS = -Wall -g -std=c++11
MAIN = app.cgi
CPPFLAGS = -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc
SRCS = main.cpp
LDFLAGS = -L/usr/local/mysql-connector-c++/lib64
LDLIBS = -lmysqlcppconn

.PHONY: all clean

all:    $(MAIN)

$(MAIN): $(SRCS)
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(SRCS) $(LDFLAGS) $(LDLIBS)

clean:
    $(RM) *.o *~ $(MAIN)

分为编译器步骤(隐式makefile规则)和链接器步骤:

CXX = g++
CXXFLAGS = -Wall -g -std=c++11
MAIN = app.cgi
CPPFLAGS = -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc
SRCS = main.cpp
OBJS = $(SRCS:.cpp=.o)
LDFLAGS = -L/usr/local/mysql-connector-c++/lib64
LDLIBS = -lmysqlcppconn

.PHONY: all clean

all:    $(MAIN)

$(MAIN): $(OBJS)
    $(CXX) -o $(MAIN) $(OBJS) $(LDFLAGS) $(LDLIBS)

clean:
    $(RM) *.o *~ $(MAIN)

最后加上./tinyxml2/tinyxml2.cpp

CXX = g++
CXXFLAGS = -Wall -g -std=c++11
MAIN = app.cgi
CPPFLAGS = -I/usr/local/include -I/usr/local/mysql-connector-c++-8.0.21/include/jdbc
SRCS = main.cpp ./tinyxml2/tinyxml2.cpp
OBJS = $(SRCS:.cpp=.o)
LDFLAGS = -L/usr/local/mysql-connector-c++/lib64
LDLIBS = -lmysqlcppconn

.PHONY: all clean

all:    $(MAIN)

$(MAIN): $(OBJS)
    $(CXX) -o $(MAIN) $(OBJS) $(LDFLAGS) $(LDLIBS)

clean:
    $(RM) *.o *~ $(MAIN)

【讨论】:

  • 真的,如果您正在构建 C++ 代码,最好使用 CXXCXXFLAGS 变量。此外,最好使用CPPFLAGS 变量来保存预处理器标志,而不是INCLUDES。如果你这样做,那么你根本不需要为%.o : %.cpp 定义你自己的模式规则:make 的内置规则会为你做这件事。我意识到您正在尝试使用原始设置,但如果我们要完全重写 makefile,不妨让它使用更多最佳实践:)
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 2012-12-20
  • 2019-07-11
  • 1970-01-01
  • 2015-09-17
  • 2017-05-04
  • 2012-07-05
相关资源
最近更新 更多