gtest与libtorch联调Debug模式下出现未定义引用问题求助
Debug模式下链接libtorch与gtest出现未定义引用的解决方案
你遇到的这个问题本质是Debug和Release模式下gtest的符号不兼容,或是libtorch内置的gtest组件与你自行编译的gtest版本/构建模式不匹配导致的链接冲突。即使删除了torch lib目录下的gtest.so,可能还有静态库、头文件或CMake配置中残留的gtest依赖在干扰链接过程。
下面是具体的排查和解决步骤:
1. 排查libtorch的gtest依赖
首先确认libtorch是否真的引入了gtest相关库:
- 在CMake配置中添加打印,查看
TORCH_LIBRARIES的内容:
如果输出里包含message(STATUS "TORCH_LIBRARIES: ${TORCH_LIBRARIES}")gtest、gtest_main或者类似项,说明torch确实依赖了gtest,这会和你自己编译的gtest产生冲突。
2. 过滤torch中的gtest依赖
如果确认torch带了gtest依赖,可以在Debug模式下从TORCH_LIBRARIES中过滤掉这些项,避免链接冲突:
add_executable(${This} ${Sources}) # 在Debug模式下移除torch中的gtest相关库 if(CMAKE_BUILD_TYPE STREQUAL "Debug") list(FILTER TORCH_LIBRARIES EXCLUDE REGEX "gtest|gtest_main") endif() target_link_libraries(${This} PUBLIC ${TORCH_LIBRARIES} gtest gtest_main ${PROJECT_NAME} )
3. 确保头文件优先级,避免冲突
如果torch的include目录中包含了gtest的头文件,你的测试程序可能会先加载torch的gtest头,而链接的是自己编译的gtest库,导致头文件与库的符号不匹配。调整include目录的顺序,让自己的gtest头目录优先:
# 先添加自己的gtest头目录 target_include_directories(${This} BEFORE PUBLIC ${GTEST_INCLUDE_DIRS}) # 再添加torch等其他头目录 target_include_directories(${This} PUBLIC ${TORCH_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
4. 确保gtest与torch的编译ABI兼容
Libtorch默认使用C++11 ABI(通过TORCH_USE_CXX11_ABI=0控制,部分版本可能不同),如果你的gtest编译时使用了不同的ABI设置,也会导致链接错误。检查并统一ABI设置:
# 在项目根CMake中添加,确保和torch的ABI一致 set(TORCH_USE_CXX11_ABI OFF) # 或ON,取决于你的torch版本 add_definitions(-D_GLIBCXX_USE_CXX11_ABI=$<IF:$<BOOL:${TORCH_USE_CXX11_ABI}>,1,0>)
5. 强制gtest以Debug模式编译
如果你的gtest是通过configure_file下载的(从GitHub的模板),确保在Debug模式下gtest也编译为Debug版本。修改gtest下载后的CMake配置,添加:
# 在gtest的构建配置中添加 set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Build type" FORCE)
这样gtest会和你的测试程序使用相同的构建模式,避免符号差异。
按照以上步骤逐一排查,应该能解决Debug模式下的链接错误。
内容的提问来源于stack exchange,提问作者Sholto Armstrong
相关产品推荐
相关产品推荐

