C++ 使用带有CMake和Conan的外部库的未定义引用

C++ 使用带有CMake和Conan的外部库的未定义引用,c++,ubuntu,cmake,undefined-reference,conan,C++,Ubuntu,Cmake,Undefined Reference,Conan,我正在尝试开发一个程序,该程序使用Conan和CMake与具有LibLogicalAccess库的PCSC USB读卡器进行通信。我按照建造和安装图书馆的指示去做,看起来一切都很顺利。我创建了一个带有“main.cpp”文件的简单控制台项目。在库的wiki上,我尝试调用库中的函数,结果导致“函数引用未定义。我知道有很多主题都涉及到这一点,但我已经尽可能多地阅读了,但似乎找不到正确的解决方案 我对Ubuntu/CMake/Conan/C++没有太多的经验,所以它可能是一个非常简单的修复程序 OS:

我正在尝试开发一个程序,该程序使用Conan和CMake与具有LibLogicalAccess库的PCSC USB读卡器进行通信。我按照建造和安装图书馆的指示去做,看起来一切都很顺利。我创建了一个带有“main.cpp”文件的简单控制台项目。在库的wiki上,我尝试调用库中的函数,结果导致“函数引用未定义。我知道有很多主题都涉及到这一点,但我已经尽可能多地阅读了,但似乎找不到正确的解决方案

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

OS:Kubuntu 18.04 郎:C++ 相关软件:LibLogicalAccess 2.2.1, CMake 3.17.1, 柯南1.25.0

main.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";
}
当我尝试使用
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
[100%]链接CXX可执行文件箱/项目
CMakeFiles/project.dir/main.cpp.o:在函数“main”中:
main.cpp:(.text+0x140):未定义对“logicalaccess::LibraryManager::getReaderProvider(std:uuuCXX11::basic_Stringconst&)”的引用
collect2:错误:ld返回了1个退出状态
CMakeFiles/project.dir/build.make:191:目标“bin/project”的配方失败
生成[2]:***[bin/project]错误1
CMakeFiles/Makefile2:95:目标“CMakeFiles/project.dir/all”的配方失败
生成[1]:***[CMakeFiles/project.dir/all]错误2
Makefile:103:目标“全部”的配方失败
make:**[全部]错误2
奇怪的是,第一行代码:
std::shared_ptr readerConfig(…)
工作正常,第二行代码给出了一个未定义的引用

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

您的错误是:

main.cpp:(.text+0x140):对“logicalaccess::LibraryManager::getReaderProvider(std::uu cxx11::basic_字符串,std::allocator>const&)”的未定义引用

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

conan profile update settings.compiler.libcxx=libstdc++11 default
请阅读柯南文档中的本节以获取更多信息

此外,在的步骤5中也有解释

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


问候!

OT:如果您没有明确的理由使用
std::shared_ptr
,请不要使用
std::unique_ptr
。您可以详细说明您运行的命令吗?您是否遵循了以下示例:?
mkdir build;cd build;conan安装..;cmake build..
cmake--build.这解决了我的问题m、 谢谢!我更改了您所说的柯南配置文件设置,重建了库,创建了一个新项目,再次安装了柯南,并且能够在没有未定义引用的情况下构建该项目。太棒了!请您将我的回答标记为已接受,以便其他用户可以使用它作为参考。即使在更新我的配置文件后,我仍然可以获得相同的e错误。您所说的“您需要安装或从源代码生成”是什么意思。我用
conan remove fmt
conan install..
清除了缓存,但没有用。。。
conan profile update settings.compiler.libcxx=libstdc++11 default