api Guardant Windows и MINGW
Добрый день!
Подскажите пожалуйста как именно можно использовать библиотеку гвардант для windows в среде MINGW? Я нашел библиотеки лишь для делфи и вижуал си, в то время как в mingw компилятор gnu c (gcc).
Вы не авторизованы. Пожалуйста, войдите или зарегистрируйтесь.
Форум Guardant → Технологии защиты → api Guardant Windows и MINGW
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
Добрый день!
Подскажите пожалуйста как именно можно использовать библиотеку гвардант для windows в среде MINGW? Я нашел библиотеки лишь для делфи и вижуал си, в то время как в mingw компилятор gnu c (gcc).
Добрый день!
Подскажите пожалуйста как именно можно использовать библиотеку гвардант для windows в среде MINGW? Я нашел библиотеки лишь для делфи и вижуал си, в то время как в mingw компилятор gnu c (gcc).
Здравствуйте.
Теоретически MinGW должен работать с объектными файлами 'MS-COFF', но у нас подобных испытаний не проводилось, и нет никаких гарантий их корректной совместной работы.
Вы можете самостоятельно попробовать собрать свое приложение или наш тестовый пример с использованием объектных файлов Guardant API (по умолчанию находятся в папке '\Lib' установленного SDK Guardant).
Теоретически MinGW должен работать с объектными файлами 'MS-COFF', но у нас подобных испытаний не проводилось, и нет никаких гарантий их корректной совместной работы.
А где можно посмотреть полный список платформ, которые поддерживаются ключами? В частности я вижу в 6 версии апи библиотеки формата gcc для api dll, но не вижу ни одного примера где они используются. Хотелось бы получить рабочий пример.
PS Комплект разработчика и ключи были куплены официально, непонятна Ваша позиция по поводу "не гарантируется", поясните пожалуйста этот момент? От нашей организации требуется составить некую заявку или официальное письмо, с тем чтобы Вы таки проверили работу ключей в данном окружении (MINGW)? Дело в том, что приложение разработано полностью в QtSDK, и его требуется защитить с использованием именно api, в частности функций задаваемых пользователем (ключи Code ). Подскажите что именно требуется чтобы скрестить апи гвардант и QtSDK/MINGW для win32?
А где можно посмотреть полный список платформ, которые поддерживаются ключами? В частности я вижу в 6 версии апи библиотеки формата gcc для api dll, но не вижу ни одного примера где они используются. Хотелось бы получить рабочий пример.
Актуальный список проверенных сред разработки можно найти в файле "guardant api samples.html" (по умолчанию находится в папке: "%Program Files%\Guardant\Guardant 6\%Public Code%\Doc"). Примеры для компиляции при помощи "gcc" есть для ОС Linux и находятся в папке - "%Program Files%\Guardant\Guardant 6\%Public Code%\Samples\x86(или x64)\Linux\General Guardant API\gcc". Также в папке - "%Program Files%\Guardant\Guardant 6\%Public Code%\Samples\ARM", есть примеры загружаемого кода.
Комплект разработчика и ключи были куплены официально, непонятна Ваша позиция по поводу "не гарантируется", поясните пожалуйста этот момент
Проверить, на полную совместимость с нашим API, все возможное множество разнообразных версий сред разработок и компиляторов нам не представляется возможным. Тестируются, как правило, наиболее популярные и распространенные среды, для которых и составляются соответствующие примеры и обучающие материалы.
От нашей организации требуется составить некую заявку или официальное письмо, с тем чтобы Вы таки проверили работу ключей в данном окружении (MINGW)?.
Мы проведем тестирование для данной среды разработки при первой возможности.
Попробовал последний MinGW 5.3 (из пакета с Qt SDK 5.8) и всё заработало из коробки.
Директория проекта:
$ ls -R
.:
CMakeLists.txt Include grddongle.cpp grddongle.h lib32 lib64
./Include:
GcaAPIdll.h GrdGcExeGenDll.h grdapi.h grderror.h nvkeyerr.h
GrdEccPairGenDll.h gcaapi.h grddrv.h grdspactivate.h nvskey32.h
./lib32:
GcaAPIdll.lib GrdAPI32.lib grddrv.lib grdspactivate.lib
./lib64:
GrdAPI64.lib grddrv.lib grdspactivate.lib
Пример CMakeLists.txt:
cmake_minimum_required(VERSION 3.8)
project("guardant" LANGUAGES CXX)
set(HEADERS)
set(SOURCES)
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/grddongle.h")
list(APPEND SOURCES "${PROJECT_SOURCE_DIR}/grddongle.cpp")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/gcaapi.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/GcaAPIdll.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/grdapi.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/grddrv.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/GrdEccPairGenDll.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/grderror.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/GrdGcExeGenDll.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/grdspactivate.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/nvkeyerr.h")
list(APPEND HEADERS "${PROJECT_SOURCE_DIR}/Include/nvskey32.h")
add_library(${PROJECT_NAME} ${OS_BUNDLE} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC "." "Include")
if(WIN32)
if (CMAKE_SIZEOF_VOID_P MATCHES 4)
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib32/GcaAPIdll.lib")
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib32/GrdAPI32.lib")
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib32/grddrv.lib")
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib32/grdspactivate.lib")
elseif(CMAKE_SIZEOF_VOID_P MATCHES 8)
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib64/GrdAPI64.lib")
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib64/grddrv.lib")
target_link_libraries(${PROJECT_NAME} INTERFACE "${PROJECT_SOURCE_DIR}/lib64/grdspactivate.lib")
else()
message(FATAL_ERROR "Unsupported bitness")
endif()
else()
message(FATAL_ERROR "Unsupported target platform")
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS YES
)
target_compile_options(${PROJECT_NAME} PRIVATE -W)
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
target_compile_options(${PROJECT_NAME} PRIVATE -Weverything)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra)
else()
message(FATAL_ERROR "Compiler ${CMAKE_CXX_COMPILER_ID} currently is not supported")
endif()
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG=1 -march=native")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -fno-inline -DDEBUG=1 -march=x86-64 -mtune=generic")
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -D_GLIBCXX_DEBUG -D_LIBCPP_DEBUG2=1")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -D_GLIBCXX_DEBUG")
endif()
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer -DNDEBUG=1 -march=native")
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -gline-tables-only")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Og -ggdb")
endif()
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -Os -DNDEBUG=1 -march=native")
Перечисление ключей из `c:\Program Files (x86)\Guardant\SDK7\Samples\General Guardant API\C++\src\demo.cpp` работает как надо.
Добрый день! Пытаюсь скомпилировать тестовый проект из Qt Creator с использованием MinGW:
...
#include "grdapi.h"
...
int main(int argc, char** argv)
{
uint32_t dwRemoteMode = GrdFMR_Local; // Operation mode flags (GrdFMR_Remote)
int nRet;
printf("Initialize this copy of GrdAPI: ");
nRet = GrdStartup(dwRemoteMode);
}
файл .pro:
QT = # проект не использует Qt
TARGET = guardant_test
TEMPLATE = app
CONFIG += c++11 console static
QMAKE_CXXFLAGS += -static
QMAKE_LFLAGS += -static
SOURCES = guardant_test.c
HEADERS = grdapi.h
LIBS += -L$$PWD/./ -lgrdapi -lpthread
на выходе GCC:
g++ -static -Wl,-subsystem,console -mthreads -o debug/guardant_test.exe debug/guardant_test.o -LD:/work/qnx/workspace/_qlib/extra/dongle -lgrdapi -lpthread
debug/guardant_test.o: In function `main':
...guardant_test.c:48: undefined reference to `GrdStartup@4'
-lgrdapi подразумевает использование libgrdapi.a ? пробовал -lGrdAPI32 - аналогично
такая же беда со сборкой примера для SLK (demo.c + grdlic)
такая же беда со сборкой примера для SLK (demo.c + grdlic)
Добрый день.
Разработчики протестировали работу MinGW, и вот их комментарии
x86 Mingw + Qt, Qt взят отсюда.
Пример работает и с grdlic.dll, и с объектным файлом grdlic_msvc.obj.
чтобы прилинковать объектный файл:
#win32: LIBS += $$-LPWD/grdlic/ -lgrdlic
#LIBS += -L$$PWD/grdlic/ -lgrdlic
win32: OBJECTS += $$PWD/grdlic/grdlic_msvc.obj
Собранный с помощью Mingw-64 при динамической линковке с grdlic.dll пример действительно падает. Проблема в библиотеке импорта grdlic.lib.
Варианты решения проблемы:
1) использовать статическую линковку с объектным файлом grdlic_msvc.obj;
2) загружать библиотеку grdlic.dll через LoadLibrary, а функции через GetProcAddress;
3) сгенерировать свою библиотеку импорта для mingw-64:
d:\EXPERIMENT\mingw_test\Qt\mingw-w64\mingw64\bin>dlltool -k --output-lib grdlic.lib --input-def grdlicx86_64.def --dllname grdlic.dll
OBJECTS += $$PWD/grdlic/grdlic_msvc.obj
спасибо, вот это заработало, но лучше использовать LIBS, а не OBJECTS, иначе эти объектные файлы будут удалены при clean
попробовал также подключить библиотеку grdapi - тоже работает
LIBS += $$PWD/GrdFWMC.obj $$PWD/grdlic_msvc.obj
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
Форум Guardant → Технологии защиты → api Guardant Windows и MINGW