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

CMake链接错误:undefined reference to ModelA类构造函数求助

项目结构
└── main/
    ├── CMakeLists.txt
    ├── src/
    │   └── main.cpp
    └── models/
        └── modelA/
            ├── src/
            │   └── h
            ├── lib
            └── CMakeLists.txt
根目录 main/CMakeLists.txt 内容
cmake_minimum_required(VERSION 3.17.0)
project(fiducial_marker_test)

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release)
ENDIF()

MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall -w  ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -w ")

# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

add_subdirectory(${CMAKE_SOURCE_DIR}/models/modelA)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/app)

add_executable(main ${CMAKE_SOURCE_DIR}/src/main.cpp)

target_include_directories(main PRIVATE ${CMAKE_SOURCE_DIR}/modules/modelA/src/)

target_link_libraries(main PRIVATE modelA)
main/models/modelA/CMakeLists.txt 内容
cmake_minimum_required(VERSION 3.17.0)
project(libmodelA)

find_package(OpenCV REQUIRED)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
file(GLOB SRC_FILE1 "./src*.c*")
file(GLOB SRC_FILE2 "./src/ED/*.c*")

include_directories(
    ${OpenCV_INCLUDE_DIRS}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/
    ${CMAKE_CURRENT_SOURCE_DIR}/src/ED/
)
add_library(
    modelA SHARED
    ${SRC_FILE1}
    ${SRC_FILE2}
)
target_include_directories(modelA INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/ED)

target_link_libraries(
    modelA
    ${OpenCV_LIBS}
)
编译错误信息
[ 92%] Building CXX object CMakeFiles/main.dir/src/main.cpp.o
[100%] Linking CXX executable ../app/main
/usr/bin/ld: CMakeFiles/main.dir/src/main.cpp.o: in function `main':
main.cpp:(.text.startup+0xb9): undefined reference to `ModelA::ModelA(int, int, bool)'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/main.dir/build.make:113: ../app/main] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/main.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2
排查建议与解决思路

1. 修正路径错误

  • 根目录CMakeLists中target_include_directories的路径写错:modules/modelA应为models/modelA,修正后为${CMAKE_SOURCE_DIR}/models/modelA/src/。
  • modelA的CMakeLists中file(GLOB SRC_FILE1 "./src*.c*")路径错误,应改为./src/*.c*,否则无法匹配src子目录下的源文件。

2. 确认库文件是否正确生成

  • 进入main/build/models/modelA目录,检查是否生成libmodelA.so(Linux下)。若未生成,说明源文件未被正确收集。
  • 在modelA的CMakeLists中添加日志输出,验证源文件匹配结果:
    message(STATUS "SRC_FILE1: ${SRC_FILE1}")
    message(STATUS "SRC_FILE2: ${SRC_FILE2}")
    
    若输出为空,说明glob路径仍有问题。

3. 检查C++符号导出与匹配

  • 用nm -D main/models/modelA/lib/libmodelA.so查看库中符号,确认是否存在ModelA::ModelA(int, int, bool)。若不存在,说明源文件未编译进库,或头文件存在错误的extern "C"声明(导致符号名被修改)。

4. 替换file(GLOB)为显式源文件列表

file(GLOB)容易因路径变化或遗漏文件导致问题,建议手动列出源文件:

set(SRC_FILES
    ./src/ModelA.cpp
    ./src/ED/xxx.cpp
    # 其他需要的源文件
)
add_library(modelA SHARED ${SRC_FILES})

5. 验证CMake目标依赖

查看main/build/CMakeCache.txt,确认modelA目标存在;确保add_subdirectory(models/modelA)在add_executable(main ...)之前执行(当前已满足)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:29:50