移动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链接器是从左到右单向解析依赖:
- 当链接器处理
libgmock.so时,会查找它引用的所有符号,但此时libgtest.so还没被处理,所以找不到gtest的相关函数 - 把
-lgtest放在-lgmock之后,链接器处理完gmock的依赖后,会在后续的gtest库中找到对应的符号 -lpthread作为系统线程库,需要放在所有依赖它的库(gtest/gmock)之后,确保所有线程相关的符号都能被正确解析
内容的提问来源于stack exchange,提问作者Heroking18
相关产品推荐
相关产品推荐

