makefile C++ Linux 的问题
Posted
技术标签:
【中文标题】makefile C++ Linux 的问题【英文标题】:trouble with makefile C++ Linux 【发布时间】:2017-07-30 23:42:28 【问题描述】:我正在尝试为未来的项目设置模板文件夹。我将在我的单元测试中加入谷歌测试。我遇到的问题是我的 makefile 没有达到我的预期。非常感谢任何帮助!
这是我的项目结构:
project_root
Makefile
/test <-- contains google test files
/src <-- my cpp files
这是我的 Makefile:
# Google Test location
GTEST_DIR = test
# Where to find user code.
USER_DIR = src
# Flags passed to the preprocessor.
CPPFLAGS += -isystem $(GTEST_DIR)/include
# Flags passed to the C++ compiler.
CXXFLAGS += -g -Wall -Wextra -pthread
# All tests produced by this Makefile. Remember to add new tests you
# created to the list.
TESTS = sample1_unittest
.PHONY : all
all: $(EXE)
clean :
rm -f $(TESTS) gtest.a gtest_main.a *.o
# All Google Test headers. Usually you shouldn't change this
# definition.
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
$(GTEST_DIR)/include/gtest/internal/*.h
# Builds gtest.a and gtest_main.a.
GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
gtest-all.o : $(GTEST_SRCS_)
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
$(GTEST_DIR)/src/gtest-all.cc
gtest_main.o : $(GTEST_SRCS_)
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
$(GTEST_DIR)/src/gtest_main.cc
gtest.a : gtest-all.o
$(AR) $(ARFLAGS) $@ $^
gtest_main.a : gtest-all.o gtest_main.o
$(AR) $(ARFLAGS) $@ $^
# Builds a sample test. A test should link with either gtest.a or
# gtest_main.a, depending on whether it defines its own main()
# function.
### these next few lines would do the job, but i'm trying to automate
### things a bit so they are commented out
#sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS)
# $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc
#
#sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
# $(USER_DIR)/sample1.h $(GTEST_HEADERS)
# $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc
#
#sample1_unittest : sample1.o sample1_unittest.o gtest_main.a
# $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
# here is where my trouble begins:
SRC = $(USER_DIR)/sample1.cc $(USER_DIR)/sample1_unittest.cc
OBJ=$(SRC:.cc=.o)
EXE=go
%.o : %.cc $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(EXE): $(OBJ) gtest_main.a
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $< -o $@
您能否查看评论“# here is where my trouble begins
”下的部分
当我运行$ make
时,我收到以下错误:
make:“所有”都无事可做。
我使用类似的 makefile 已经有一段时间了,但现在我已经将它添加到单元测试并将 src 文件移动到他们自己的文件夹中,它已经损坏了。
我将在未来的所有构建中使用它,所以我真的很想现在就做好这个设置。
提前感谢您提供的任何帮助。
感谢您的修复。
我将以下 3 行移到 .phony 上方:全部
SRC = $(USER_DIR)/sample1.cc $(USER_DIR)/sample1_unittest.cc
OBJ=$(SRC:.cc=.o)
EXE=go
最后我也有一个错误,最后一行应该是:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
【问题讨论】:
你希望它做什么? @Beta 我希望它能够构建一个名为“go”的可执行测试甜点 cmake 更简单更好! 【参考方案1】:在all: $(EXE)
中调用时,EXE
似乎是未定义的。
它的定义要低得多。所以你的 all: 行在翻译时只有 all:
。
【讨论】:
这解决了这个问题,我有一个二次构建问题collect2: error: ld returned 1 exit status Makefile:68: recipe for target 'go' failed
除非你有任何建议,否则我会追查一下
这是一个与你的makefile无关的链接错误。以上是关于makefile C++ Linux 的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Makefile.am/Makefile.in 在 Ubuntu Linux 中构建 c++ 项目
Linux:从给定的源文件自动创建 C++ makefile