【问题标题】:Undefined reference using external library with CMake and Conan使用带有 CMake 和 Conan 的外部库的未定义引用
【发布时间】:2022-01-16 02:11:46
【问题描述】:

我正在尝试开发一个程序,该程序使用 Conan 和 CMake 与 LibLogicalAccess 库与 PCSC USB 阅读器进行通信。我按照构建和安装库的说明进行操作,似乎一切正常。我创建了一个带有“main.cpp”文件的小型简单控制台项目。在库的 wiki 上的 C++ guide 之后,我尝试从库中调用一个函数,这导致“未定义对 函数的引用。我知道有很多主题涵盖了这个,但我有尽可能多地阅读,但似乎找不到正确的解决方案。

我对 Ubuntu/CMake/Conan/C++ 没有太多经验,所以它可能是一个非常简单的修复。

操作系统:Kubuntu 18.04 朗:C++ 相关软件:LibLogicalAccess 2.2.1, CMake 3.17.1, 柯南 1.25.0

ma​​in.cpp

#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&lt;logicalaccess::ReaderConfiguration&gt; readerConfig(...) 工作正常,而第二行代码给出了未定义的引用。

我在同一个文件中尝试了其他函数,它们给出了相同的结果。当我删除最后一行“setReaderProvider”代码时,该文件编译并运行良好。还尝试了很多关于 conanfile.txt 和 CMakeLists.txt 的不同小调整。

【问题讨论】:

  • OT:如果您没有明确的理由使用std::shared_ptr,请不要使用。请改用std::unique_ptr
  • 您能详细说明您运行的命令吗?您是否按照以下示例进行操作:github.com/islog/liblogicalaccess/wiki/Build-Liblogicalaccessmkdir build ; cd build ; conan install .. ; cmake build ..cmake --build .

标签: c++ ubuntu cmake undefined-reference conan


【解决方案1】:

你的错误说:

main.cpp:(.text+0x140): 未定义引用 `logicalaccess::LibraryManager::getReaderProvider(std::__cxx11::basic_string, std::allocator > const&)'

这是因为您的 CMake 使用 libstdc++11 进行链接,但是,由于向后兼容性,Conan 被配置为使用 libstdc++。 你需要更新你的默认 libcxx:

conan profile update settings.compiler.libcxx=libstdc++11 default

请阅读柯南文档How to Manage GCC ABI 中的此部分以获取更多信息。

另外,Getting Started 的第 5 步也有说明。

现在再次构建时,您将需要您的本地包不可用,因为它是一个新包,使用不同的设置,因此您需要安装或从源代码构建。指向 libstdc++11 的链接由柯南自动管理,它将定义传递给 CMake。

问候!

【讨论】:

  • 这解决了我的问题,谢谢!我按照您的说法更改了柯南配置文件设置,重建了库,创建了一个新项目,再次安装柯南并且能够在没有未定义引用的情况下构建项目。
  • 太好了!您能否将我的答案标记为已接受,以便其他用户可以参考。
  • 即使在更新了我的个人资料后,我仍然遇到同样的错误。您究竟是什么意思“您需要安装或从源代码构建”。我用conan remove fmtconan install .. 清除了我的缓存,但无济于事......
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2014-03-30
  • 1970-01-01
  • 2011-04-09
  • 2020-10-29
相关资源
最近更新 更多