Неопределенная ссылка с использованием внешней библиотеки с CMake и Conan - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь разработать программу, которая взаимодействует с USB-ридером PCS C с помощью Conan и CMake с библиотекой LibLogicalAccess. Я выполнил инструкции по сборке и установке библиотеки, которые, казалось, прошли нормально. Я создал небольшой простой консольный проект с файлом «main. cpp». Следуя руководству C ++ в wiki библиотеки, я попытался вызвать функцию из библиотеки, которая привела к «Неопределенной ссылке на function . Я знаю, что есть много тем, охватывающих это, но я прочитал столько, сколько мог, но, похоже, не нашел правильного решения.

У меня нет большого опыта работы с Ubuntu / CMake / Conan / C ++, так что это может быть очень простой fix.

ОС: Kubuntu 18.04 Язык: C ++ Связанное программное обеспечение: LibLogicalAccess 2.2.1, CMake 3.17.1, Conan 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";
}

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.

1 Ответ

1 голос
/ 25 мая 2020

Ваша ошибка говорит:

main. cpp :(. Text + 0x140): undefined ссылка на `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

Пожалуйста, прочтите этот раздел в Conan docs How to Manage G CC ABI , чтобы получить дополнительную информацию.

Кроме того, это объясняется на шаге 5 Начало работы .

Теперь при повторной сборке вам потребуется, чтобы ваши локальные пакеты не были доступны, потому что это новый пакет с другими настройками. , поэтому вам нужно будет установить или собрать из исходников. Ссылка на libstdc ++ 11 автоматически управляется Конаном, он передает определения в CMake.

С уважением!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...