Рад, что смог помочь улучшить crypto ++ для cmake. Отличный ответ.

орое время назад я начал кодировать свое приложение в Visual Studio 2015, не было проблем с настройкой всех зависимостей библиотеки.

Теперь я решил перейти на CLion. Однако мое приложение имеет зависимостьcryptopp библиотека, которую мне нужно связать в моем проекте CLion.

В настоящее время я сталкиваюсь с тоннамиundefined reference ошибки

undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::Integer::Integer(char const*)'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::AccessGroupParameters()'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::GetGroupParameters() const'
undefined reference to `CryptoPP::DH_Domain<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime, CryptoPP::EnumToType<CryptoPP::CofactorMultiplicationOption, 0> >::GetGroupParameters() const'
[..]

Я действительно установил каталоги include в моих CMakeLists:

set(EXTERN_LIBS E:/dev/libs)

include_directories(${EXTERN_LIBS} ${EXTERN_LIBS}/include)
link_directories(${EXTERN_LIBS})

Тем не менее, я до сих пор не могу заставить его работать.

Я использую MinGW для своего проекта. Вот предварительный просмотр настроек и версий:

Как я могу правильно добавитьcryptopp библиотека в мой проект в CLion?

 Mike Kinghan28 окт. 2017 г., 18:31
Твойcryptlib.lib был построен с MS VC ++. Теперь вы пытаетесь связать его с объектными файлами, скомпилированными с помощью GCC (MinGW). Это не работает GCC и VC ++ имеют несовместимыеАБИСв частности разныеискажение имени протоколы. Следовательно, искаженные идентификаторы C ++, испускаемые MinGW в вашем объектном коде, не соответствуют ни одному из экспортируемых вашей скомпилированной библиотекой VC ++ и являются неопределенными ссылками. Вам нужно построитьcryptopp из источника с MinGW для создания ABI-совместимой библиотеки.
 Kesse29 окт. 2017 г., 04:59
@MikeKinghan Могу ли я использовать компилятор Visual Studio тогда? Я немного прочитал о cryptopp и оказалось, что он не поддерживает CMake.
 Mike Kinghan29 окт. 2017 г., 11:10
В самом деле?CMakeLists.txt вcryptopp 5.6.5 GitHub скачать у меня без проблем работает сборка пакета с mingw-w64 GCC 7.2.0 на Windows 10 Pro. И, конечно, вы можете построить его с MS VC ++
 Some programmer dude28 окт. 2017 г., 13:15
С участиемlink_directories(${EXTERN_LIBS}) Вы только добавляете каталог к ​​пути поиска. Вы на самом деле не говорите CMakeссылка с любой библиотекой. Для этого используйтеtarget_link_libraries команда.
 Kesse28 окт. 2017 г., 15:22
@ Someprogrammerdude Я уже пробовал это. Либо я получаюmingw32/bin/ld.exe: cannot find -lcryptlib ошибка при использованииtarget_link_libraries(myapp cryptlib.lib), Когда я указываю полный путь к библиотеке, эта ошибка исчезает, однакоundefined reference ошибки остаются.

Ответы на вопрос(1)

Решение Вопроса

что мы, возможно, в основном очистили проблему MinGW / C ++ 11 вСовершить e4cef84883b2, Вы должны работать от Мастера или выполнитьgit pullи затем раскомментируйте определение дляCRYPTOPP_NO_CXX11 вconfig.h : 65 (или так):

// Define CRYPTOPP_NO_CXX11 to avoid C++11 related features shown at the
// end of this file. Some compilers and standard C++ headers advertise C++11
// but they are really just C++03 with some additional C++11 headers and
// non-conforming classes. You might also consider `-std=c++03` or
// `-std=gnu++03`, but they are required options when building the library
// and all programs. CRYPTOPP_NO_CXX11 is probably easier to manage but it may
// cause -Wterminate warnings under GCC. MSVC++ has a similar warning.
// Also see https://github.com/weidai11/cryptopp/issues/529
// #define CRYPTOPP_NO_CXX11 1

, что проблема в том, что вы сталкиваетесь с проблемами, связанными с Windows и отсутствием надлежащей поддержки C ++ 11, но вы получаете их косвенно. Они косвенные, потому что MinGW и GCC расположены сверху. MinGW и GCC не могут предоставить C ++ 11, потому что базовая платформа не может.

, что ваша лучшая ставка на данный момент заключается в определенииCRYPTOPP_NO_CXX11, Я не верю, что мы можем сделать это для вас, как в Windows, потому что определения, к которым нам нужен доступ, скрыты за MinGW и GCC. И у нас также есть некоторые ошибки MSVC ++ для обхода.

Вот как мы это делаем в Windows, но у нас нет доступа к этим определениям в MinGW (изconfig.h : 950):

// Dynamic Initialization and Destruction with Concurrency ("Magic Statics")
// MS at VS2015 with Vista (19.00); GCC at 4.3; LLVM Clang at 2.9; Apple Clang at 4.0; Intel 11.1; SunCC 5.13.
// Microsoft's implementation only works for Vista and above, so its further
// limited. http://connect.microsoft.com/VisualStudio/feedback/details/1789709
#if (CRYPTOPP_MSC_VERSION >= 1900) && ((WINVER >= 0x0600) || (_WIN32_WINNT >= 0x0600)) || \
    (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000) || \
    (__INTEL_COMPILER >= 1110) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
# define CRYPTOPP_CXX11_DYNAMIC_INIT 1
#endif // Dynamic Initialization compilers

Если вы определитеCRYPTOPP_NO_CXX11то следующее будетне определитесь и вы избежите проблем:CRYPTOPP_CXX11_DYNAMIC_INIT, CRYPTOPP_CXX11_SYNCHRONIZATION, а такжеCRYPTOPP_CXX11_ATOMICS.

Второй вопрос, связанный с Клионом и Cmake, был решен следующим образом. Мы устанавливаем отдельный GitHub с нашими файлами Autotools и Cmake. Файлы автоинструментов находятся по адресуcryptopp-Autotoolsи файлы Cmake находятся по адресуcryptopp-CMake.

Репозитории находятся в моем GiHub, потому что это тот тип администрирования, которого предпочитает избегать Вей Дай, который написал библиотеку и предоставляет Crypto ++ GitHub. Логическое разделение также помогает установить логическую границу, поэтому люди знают, что Autotools и CMake не являются частью официального дистрибутива Crypto ++.

Сообщество отвечает за Autotools и Cmake, и мы будем работать с сообществом по вопросам. Если сообщество включится в работу, то Autotools и Cmake улучшатся. Если Autotools или CMake станут стабильными, то мы добавим tarball с файлами в официальный дистрибутив.

В настоящее время Autotools и Cmake находятся в состояниях, которые нуждаются в улучшении. Проблемы с Cmake подробно описаны наCMake | Текущее состояние на вики. Проблемы с Autotools на самом деле не задокументированы, потому что я работаю с сопровождающими дистрибутивов над ними. Вроде как мы знаем, что это за проблемы, а большинство других - нет.

 Kesse06 нояб. 2017 г., 21:29
Рад, что смог помочь улучшить crypto ++ для cmake. Отличный ответ.

Ваш ответ на вопрос