提问人:DKhusted 提问时间:8/29/2023 最后编辑:DKhusted 更新时间:9/2/2023 访问量:55
CMake 链接器错误:对类的未定义引用
CMake Linker error : undefined reference to class
问:
我正在尝试使用以下结构构建一个项目:
└── 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}
)
当我尝试运行 cmake --build 时。从 main/build 中,它给出以下错误:
[ 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
我已经尝试了不同的方法来解决这个问题,但到目前为止还没有运气。我相信是链接问题吗? 我是 cmake 的新手,所以任何提示或见解将不胜感激。
答:
0赞
ChrisMarLie
9/2/2023
#1
首先,我将设置 CMake verbose 来检查编译命令CMAKE_VERBOSE_MAKEFILE
set(CMAKE_VERBOSE_MAKEFILE ON)
然后当你运行 cmake --build 时,你应该能够看到类似 link 的东西,这意味着它做得很好。-lmodels/ModelA/libModelA.so
其次,在不检查代码的情况下检查这一点时,ModelA.h 中的构造函数签名似乎可能与 ModelA.cc 中的构造函数签名不同。会是这样吗?
最后,你可以使你的CMake配置更简洁、更简洁。使用 时,大多数情况下,可以与这些包的目标链接。这些目标包含库和标头,因此无需手动仅包含和链接必要的库。如果您与 INTERFACE 或 PUBLIC 一起使用,这同样适用于您自己的库。您可以在使用 OpenCV 的 CMake 模块目标中查看 OpenCV 目标,而不是直接包含所有库?或在 Conan 中心查看其他 libs 目标。这样做,会像这样:find_package
target_include_directories
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*")
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 PRIVATE opencv_core)
评论
0赞
DKhusted
9/3/2023
感谢您的输入!我了解这些信息,并提供帮助。我确实发现了错误,这是由我的 ....路径应该是......SRC_FILE1
"./src/*.c*"
0赞
ChrisMarLie
9/4/2023
这是真的,我没有注意到。下次,您可以尝试使用 ,这可以帮助您避免这些错误。aux_source_directory(<dir> <variable>)
评论