C++ 犰狳库提供了对 `arma::arma_rng_cxx11_instance' 的未定义引用

Posted

技术标签:

【中文标题】C++ 犰狳库提供了对 `arma::arma_rng_cxx11_instance\' 的未定义引用【英文标题】:C++ Armadillo library gives undefined reference to `arma::arma_rng_cxx11_instance'C++ 犰狳库提供了对 `arma::arma_rng_cxx11_instance' 的未定义引用 【发布时间】:2018-09-01 14:39:51 【问题描述】:

我使用 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关于编辑对方的代码。 【参考方案1】:

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

【讨论】:

以上是关于C++ 犰狳库提供了对 `arma::arma_rng_cxx11_instance' 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中返回多个矩阵(犰狳库)

在 C++ Xcode 中链接犰狳库

C++ 中矩阵的动态名称(犰狳库)

犰狳 C++ 矩阵线程安全吗

了解 Makefile。 make 无法链接犰狳库

犰狳库是不是会减慢矩阵运算的执行速度?