You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动MakeFile后编译触发undefined reference错误(关联gmock/gtest)

解决Makefile链接错误及多目录编译问题

问题诊断

你遇到的undefined reference错误,核心原因是链接库的顺序不符合GCC链接器的解析规则:

  • Google Mock(gmock)依赖Google Test(gtest)的API,但当前LDFLAGS中-lgtest放在了-lgmock前面,导致链接器处理gmock时找不到gtest的符号
  • 线程库-lpthread的位置也需要调整,必须放在依赖它的库之后

你已经完成了多目录编译的路径配置(包含目录、源文件路径),这部分是正确的,无需修改。

修复方案

修改Makefile中的LDFLAGS变量,调整链接库的顺序:

# 替换原LDFLAGS为以下内容
LDFLAGS=-lgmock -lgmock_main -lgtest -lpthread

修改后的完整Makefile

PRODUCT=Main

CPPFLAGS=-Iproduct -Itest -Istacks_cpp/product -Iqueue_cpp/product
CXXFLAGS=-Wall -Werror -Wextra -pedantic -ggdb -O0 $(CPPFLAGS)

SOURCES=$(wildcard product/*.cpp) \
        $(wildcard test/*.cpp)  \
        $(wildcard stacks_cpp/product/*.cpp)    \
        $(wildcard queue_cpp/product/*.cpp)

HEADERS=$(wildcard product/*.h) \
        $(wildcard test/*.h)    \
        $(wildcard stacks_cpp/product/*.h)  \
        $(wildcard queue_cpp/product/*.h)

# 调整后的链接库顺序
LDFLAGS=-lgmock -lgmock_main -lgtest -lpthread

CXX=g++

.PHONY: all clean test

all: $(PRODUCT)

$(PRODUCT): $(SOURCES) $(HEADERS)
    @$(CXX) $(CXXFLAGS) $(SOURCES) -o $@ $(LDFLAGS)

clean:
    @rm -rf $(PRODUCT)
    @rm -rf kwinject.out .kwlp .kwps

klocwork:
    @kwcheck run

klocwork_after_makefile_change: clean
    @/opt/klocwork/kwenv.sh
    @kwcheck run

test: $(PRODUCT)
    @./$(PRODUCT)

原因说明

GCC链接器是从左到右单向解析依赖:

  1. 当链接器处理libgmock.so时,会查找它引用的所有符号,但此时libgtest.so还没被处理,所以找不到gtest的相关函数
  2. 把-lgtest放在-lgmock之后,链接器处理完gmock的依赖后,会在后续的gtest库中找到对应的符号
  3. -lpthread作为系统线程库,需要放在所有依赖它的库(gtest/gmock)之后,确保所有线程相关的符号都能被正确解析

内容的提问来源于stack exchange,提问作者Heroking18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:40:31