c++ - 使用带有 CMake 和 Conan 的外部库的未定义引用
问题描述
我正在尝试开发一个程序,该程序使用 Conan 和 CMake 与 LibLogicalAccess 库与 PCSC USB 阅读器进行通信。我按照构建和安装库的说明进行操作,似乎一切正常。我创建了一个带有“main.cpp”文件的小型简单控制台项目。按照库 wiki 上的C++ 指南,我尝试从库中调用一个函数,结果导致“未定义对函数的引用。我知道有很多主题涵盖了这个,但我已经阅读了尽可能多的内容,但可以似乎没有找到正确的解决方案。
我对 Ubuntu/CMake/Conan/C++ 没有太多经验,所以它也可能是一个非常简单的修复。
操作系统:Kubuntu 18.04 语言:C++ 相关软件:LibLogicalAccess 2.2.1、CMake 3.17.1、Conan 1.25.0
主文件
#include <iostream>
#include <logicalaccess/dynlibrary/librarymanager.hpp>
#include <logicalaccess/readerproviders/readerconfiguration.hpp>
#include <logicalaccess/cards/chip.hpp>
int main()
{
std::cout << "Program started\n";
// Reader configuration object to store reader provider and reader unit selection.
std::shared_ptr<logicalaccess::ReaderConfiguration> readerConfig(new logicalaccess::ReaderConfiguration());
// Set PCSC ReaderProvider by calling the Library Manager which will load the function from the corresponding plug-in
readerConfig->setReaderProvider(logicalaccess::LibraryManager::getInstance()->getReaderProvider("PCSC"));
std::cout << "after..\n";
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(project)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
set(CMAKE_CXX_FLAGS "-I /usr/include/PCSC")
add_executable(project main.cpp)
target_link_libraries(project PUBLIC CONAN_PKG::LogicalAccess)
当我尝试使用cmake --build .
它构建程序时,输出如下:
[100%] Linking CXX executable bin/project
CMakeFiles/project.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x140): undefined reference to `logicalaccess::LibraryManager::getReaderProvider(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status
CMakeFiles/project.dir/build.make:191: recipe for target 'bin/project' failed
make[2]: *** [bin/project] Error 1
CMakeFiles/Makefile2:95: recipe for target 'CMakeFiles/project.dir/all' failed
make[1]: *** [CMakeFiles/project.dir/all] Error 2
Makefile:103: recipe for target 'all' failed
make: *** [all] Error 2
奇怪的是第一行代码:std::shared_ptr<logicalaccess::ReaderConfiguration> readerConfig(...)
工作正常,第二行代码给出了未定义的引用。
我在同一个文件中尝试了其他函数,它们给出了相同的结果。当我删除最后一行“setReaderProvider”代码时,该文件编译并运行良好。还尝试了很多关于 conanfile.txt 和 CMakeLists.txt 的不同小调整。
解决方案
你的错误说:
main.cpp:(.text+0x140): 未定义引用 `logicalaccess::LibraryManager::getReaderProvider(std::__cxx11::basic_string, std::allocator > const&)'
发生这种情况是因为您的 CMake 使用 libstdc++11 进行链接,但是,由于向后兼容性,柯南被配置为使用 libstdc++。您需要更新您的默认 libcxx:
conan profile update settings.compiler.libcxx=libstdc++11 default
请阅读柯南文档如何管理 GCC ABI中的此部分以获取更多信息。
此外,它在Getting Started的第 5 步中进行了说明。
现在再次构建时,您将需要您的本地包不可用,因为它是一个新包,使用不同的设置,因此您需要安装或从源代码构建。指向 libstdc++11 的链接由柯南自动管理,它将定义传递给 CMake。
问候!
推荐阅读
- c - 禁用串行端口的软件流控制时无法通信
- kubernetes - 如何在未激活 alpha 功能的情况下在 1.8 版上调整 Kubernetes 卷 (AWS EBS) 的大小?
- javascript - 函数不会从 eventListener 中删除
- javascript - React Router Dom 不会将 Function 传递给子级
- node.js - semver 表示法不更新补丁/次要版本
- java - 在微服务架构中存储常量字段的最佳方式是什么?
- javascript - 扩展 vue 组件以填充另一个父 div
- r - 条件面板与闪亮的反应性相结合
- javascript - vuejs 模板中的引号
- php - Laravel 对数据库中的数据进行排序