如何解决未定义对符号'<Symbol>'的引用...添加符号时出错:命令行使用CMake缺少DSO
问题概述:
我正在编写一个项目,并且能够获取(到目前为止)所编写的代码进行编译,因此我想自己应该开始编写一个示例可执行文件,以确保一切都能按预期工作。我是C ++的新手,甚至是CMake的新手(如果代码看起来不太好,请原谅我)。在为可执行文件创建基础工作之后,我决定make
对其执行操作,最终导致错误:
/usr/bin/ld: CMakeFiles/oneLinkAdaptive.dir/oneLinkAdaptiveExample.cpp.o: undefined reference to symbol '_ZN5robot12configurator16initializeParamsEPKc'
/usr/bin/ld: //home/pi/Desktop/cfucr/build/src/configurator/libconfigurator-libs.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [src/examples/CMakeFiles/oneLinkAdaptive.dir/build.make:86: src/examples/oneLinkAdaptive] Error 1
make[1]: *** [CMakeFiles/Makefile2:46987: src/examples/CMakeFiles/oneLinkAdaptive.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
据我了解,这实际上是一个CMake错误,或者我无法添加库,或者可能无法在我编写的C ++代码中找到一个函数(?):
namespace robot
{
namespace configurator
{
std::tuple<ParamsR,ParamsF,ParamsC> initializeParams(const char* configFile);
...
(我不太愿意相信C ++代码出了什么问题,但老实说,我现在还不知道。)我在网上做了一些窥探,并尝试了其他帖子中的一些内容,例如,将库移动到在将可执行文件添加到CMake之前,请确保正在创建libsconfigurator-libs
库,并检查以确保我实际上包含了libsconfigurator-libs
库,并将内容从PRIVATE
更改为PUBLIC
,等
主要src
CMake文件被编写为:
# Add controller main files #
add_library(cfucr-libs
controller.cpp
controller.hpp
)
# Add the `src` directory to be included #
set(CFUCR_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(
${CFUCR_BASE_DIR}
)
# Add a list of subdirectories #
add_subdirectory(configurator)
add_subdirectory(control)
add_subdirectory(filter)
add_subdirectory(mathUtilities)
add_subdirectory(thirdParty)
add_subdirectory(types)
target_link_libraries(cfucr-libs PRIVATE
configurator-libs
control-libs
filter-libs
math-utilities-libs
type-libs
tinyxml2
eigen
)
add_subdirectory(examples)
可执行文件位于examples
子目录的下方,因此我将add_subdirectory
移到了文件底部。这样,我可以确保将我创建的所有其他库添加到主cfucr
库中。 examples
CMake文件写为:
# Add controller example main files #
add_library(examples-libs
oneLinkAdaptiveExample.cpp
)
# Make executable files for controller examples #
add_executable(oneLinkAdaptive
oneLinkAdaptiveExample.cpp
)
target_link_libraries(oneLinkAdaptive PRIVATE
cfucr-libs
examples-libs
)
基本上,仅创建可执行文件并将主库添加到其中。配置器库非常简单,并给出为:
# Add configurator files #
add_library(configurator-libs
configurator.cpp
configurator.hpp
)
我已经尝试了一段时间以解决此问题,但是似乎没有任何效果/我不完全了解所有这些如何工作才能真正自己解决问题。如果有人对我可能做错的事情有任何想法,我很想听听。另外,如果我需要发布其他任何内容(任何其他CMake文件或源文件)以帮助使事情变得更清楚,请告诉我,我将发布它们!
谢谢!
解决方法
您应该尝试将此通话更改为target_link_libraries
:
target_link_libraries(cfucr-libs PRIVATE
configurator-libs
control-libs
filter-libs
math-utilities-libs
type-libs
tinyxml2
eigen
)
改为使用PUBLIC
:
target_link_libraries(cfucr-libs PUBLIC
configurator-libs
control-libs
filter-libs
math-utilities-libs
type-libs
tinyxml2
eigen
)
对于PRIVATE
,列出的库(例如configurator-libs
)不属于链接接口。因此,使用CMake目标(例如,可执行文件)将无法查看这些库及其定义。使用PUBLIC
,列出的库 被添加到链接接口,因此,当您将oneLinkAdaptive
链接到可执行文件时,可执行文件cfucr-libs
也会使用它们。
我建议您通读target_link_libraries
文档,特别是链接的部分,该部分描述了范围界定关键字(即PUBLIC
,PRIVATE
等)之间的区别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。