api Guardant Windows и MINGW

Добрый день!

Подскажите пожалуйста как именно можно использовать библиотеку гвардант для windows в среде MINGW? Я нашел библиотеки лишь для делфи и вижуал си, в то время как в mingw компилятор gnu c (gcc).

Re: api Guardant Windows и MINGW

Neekeetos пишет:

Добрый день!
Подскажите пожалуйста как именно можно использовать библиотеку гвардант для windows в среде MINGW? Я нашел библиотеки лишь для делфи и вижуал си, в то время как в mingw компилятор gnu c (gcc).

Здравствуйте.

Теоретически MinGW должен работать с объектными файлами 'MS-COFF', но у нас подобных испытаний не проводилось, и нет никаких гарантий их корректной совместной работы.

Вы можете самостоятельно попробовать собрать свое приложение или наш тестовый пример с использованием объектных файлов Guardant API (по умолчанию находятся в папке '\Lib' установленного SDK Guardant).

(2012-03-15 07:51:42 отредактировано Neekeetos)

Re: api Guardant Windows и MINGW

Антон Тихиенко пишет:

Теоретически MinGW должен работать с объектными файлами 'MS-COFF', но у нас подобных испытаний не проводилось, и нет никаких гарантий их корректной совместной работы.

А где можно посмотреть полный список платформ, которые поддерживаются ключами?  В частности я вижу в 6 версии апи библиотеки формата gcc для api dll, но не вижу ни одного примера где они используются. Хотелось бы получить рабочий пример.

PS Комплект разработчика и ключи были куплены официально, непонятна Ваша позиция по поводу "не гарантируется", поясните пожалуйста этот момент? От нашей организации требуется составить некую заявку или официальное письмо, с тем чтобы Вы таки проверили работу ключей в данном окружении (MINGW)? Дело в том, что приложение разработано полностью в QtSDK, и его требуется защитить с использованием именно api, в частности функций задаваемых пользователем (ключи Code ). Подскажите что именно требуется чтобы скрестить апи гвардант и QtSDK/MINGW для win32?

Re: api Guardant Windows и MINGW

Neekeetos пишет:

А где можно посмотреть полный список платформ, которые поддерживаются ключами?  В частности я вижу в 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", есть примеры загружаемого кода.

Neekeetos пишет:

Комплект разработчика и ключи были куплены официально, непонятна Ваша позиция по поводу "не гарантируется", поясните пожалуйста этот момент

Проверить, на полную совместимость с нашим API, все возможное множество разнообразных версий сред разработок и компиляторов нам не представляется возможным. Тестируются, как правило, наиболее популярные и распространенные среды, для которых и составляются соответствующие примеры и обучающие материалы.

Neekeetos пишет:

От нашей организации требуется составить некую заявку или официальное письмо, с тем чтобы Вы таки проверили работу ключей в данном окружении (MINGW)?.

Мы проведем тестирование для данной среды разработки при первой возможности.

Re: api Guardant Windows и 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` работает как надо.

Re: api Guardant Windows и MINGW

Добрый день! Пытаюсь скомпилировать тестовый проект из 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 - аналогично

Re: api Guardant Windows и MINGW

такая же беда со сборкой примера для SLK (demo.c + grdlic)

Re: api Guardant Windows и MINGW

iluha пишет:

такая же беда со сборкой примера для 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

Re: api Guardant Windows и MINGW

Тимофей Ершов пишет:

OBJECTS += $$PWD/grdlic/grdlic_msvc.obj

спасибо, вот это заработало, но лучше использовать LIBS, а не OBJECTS, иначе эти объектные файлы будут удалены при clean

попробовал также подключить библиотеку grdapi - тоже работает

LIBS += $$PWD/GrdFWMC.obj $$PWD/grdlic_msvc.obj