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' 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章