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 C++ Linux 的问题

使用 Makefile.am/Makefile.in 在 Ubuntu Linux 中构建 c++ 项目

4.Makefile工程管理

Linux:从给定的源文件自动创建 C++ makefile

在 Linux 中执行 C++ makefile 时遇到问题(在 mac 上运行良好)

如何通过 Makefile 将 cap_net_raw 功能添加到 Linux 上的 c++ 可执行文件