【问题标题】:C++ Armadillo library gives undefined reference to `arma::arma_rng_cxx11_instance'C++ 犰狳库提供了对 `arma::arma_rng_cxx11_instance' 的未定义引用
【发布时间】:2023-03-15 12:19:01
【问题描述】:

我使用 CMake 构建我的项目并使用 Catch2 进行测试。以下是我的项目结构

├── build
├── CMakeLists.txt
├── compile_commands.json
├── include
│   ├── node.h
│   ├── rrt.h
│   └── tree.h
├── Makefile
├── package.xml
├── scripts
├── src
│   ├── main.cpp
│   ├── node.cpp
│   ├── rrt.cpp
│   └── tree.cpp
├── test
│   ├── CMakeLists.txt
│   └── test.cpp
└── third_party
    └── catch.hpp

在./CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(rrt_ros)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(SOURCES 
    ${CMAKE_CURRENT_SOURCE_DIR}/include/rrt.h
    ${CMAKE_CURRENT_SOURCE_DIR}/include/tree.h
    ${CMAKE_CURRENT_SOURCE_DIR}/include/node.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/rrt.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/tree.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/node.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
    )

find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
find_package(Armadillo REQUIRED)
FIND_PACKAGE(Eigen3 REQUIRED)

add_executable(
    rrt
    ${SOURCES}
    )

target_include_directories(
    rrt
    PUBLIC
    ${catkin_INCLUDE_DIRS}
    ${EIGEN3_INCLUDE_DIR}
    ${ARMADILLO_INCLUDE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)


target_link_libraries(rrt ${catkin_LIBRARIES} ${ARMADILLO_LIBRARIES})
add_subdirectory(test)

在test/CMakeLists.txt,我有

project(rrt_ros)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
find_package(Armadillo REQUIRED)
FIND_PACKAGE(Eigen3 REQUIRED)
message("TESTING......" ${CMAKE_CURRENT_SOURCE_DIR}/../include/rrt.h)

add_executable(rrt_test test.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../include/rrt.h
    ${CMAKE_CURRENT_SOURCE_DIR}/../include/tree.h
    ${CMAKE_CURRENT_SOURCE_DIR}/../include/node.h
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/rrt.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/tree.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/node.cpp
    )

target_include_directories(
    rrt_test
    PUBLIC
    ${catkin_INCLUDE_DIRS}
    ${Armadillo_INCLUDE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/../third_party
    ${CMAKE_CURRENT_SOURCE_DIR}/../include
    )

target_link_libraries(
    rrt_test
    ${catkin_LIBRARIES}
    ${Aramdillo_LIBRARIES}
    )

在rrt.cpp,我有一个函数调用犰狳的采样函数

arma::randi<arma::mat>(1, 2, arma::distr_params(1, 10))

当我编译项目时,它给了我一个未定义的错误:

rrt.cpp:(.text._ZTWN4arma23arma_rng_cxx11_instanceE[_ZTWN4arma23arma_rng_cxx11_instanceE]+0x15):  undefined reference to 'arma::arma_rng_cxx11_instance'  
collect2: error: ld returned 1 exit status

但是,当我在 ./test/CMakeLists.txt 中注释掉 ${CMAKE_CURRENT_SOURCE_DIR}/../src/rrt.cpp 时,它编译得很好。

【问题讨论】:

  • 我不能告诉你问题是什么,但我可以给你一个提示。 “未定义引用”错误是链接时错误,因此您的代码可以编译,但链接器找不到列出的函数。
  • test/CMakeLists.txt 中有错字; ${Aramdillo_LIBRARIES} 不应该是 ${Armadillo_LIBRARIES},还是在组装这个问题时出现编辑错误?
  • @compor:[关于编辑]:请不要更改其他人的代码样式,除非当前样式完全一团糟或严重损害可读性。如果多行序列包含在括号中,则右括号的位置(在最后一个符号之后或在新行处)是一个选择问题。 (例如,我发现新行是右括号的更好位置)。不要仅仅为了遵循你喜欢的代码风格而编辑其他人的代码。
  • @Tsyvarev 请不要假设我的喜好。这不是我最喜欢的编码风格,它节省了网站上的垂直滚动空间。简洁、简洁和节俭是有道理的。
  • "...它节省了网站上的垂直滚动空间。简洁、简洁和节俭是有道理的。" - 但它隐藏了很多(视觉上)右括号。无论如何,代码是提问者的责任,别人更改代码会使提问者感到困惑。有一个FAQ on Meta关于编辑对方的代码。

标签: c++ cmake armadillo


【解决方案1】:

我最近遇到了同样的问题。 在您的test/CmakeLists.txt 中,应使用${ARMADILLO_LIBRARIES} 而不是${Aramdillo_LIBRARIES}(拼写错误和大写问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多