Обход __declspe c (dllimport) в преобразовании проекта windows в linux - PullRequest
0 голосов
/ 13 января 2020

Я в процессе преобразования среды Visual Studio C ++ в сборку linux, и в процессе устранения windows зависимостей я столкнулся с целой кучей вызовов __declspe c (dllimport) в некотором заголовке файлы. Эти заголовочные файлы определяют набор функций и классов, которые используются в исходных файлах, поэтому они необходимы для сборки.

Вот точные строки, использующие вызов __declspe c ().

#ifndef UeiDaqAPI
    #define UeiDaqAPI __declspec(dllimport)
#endif

UeiDaqAPI - это коллекция классов и функций, которые используют все исходные файлы. Вызов declspe c, насколько я понимаю, связывает функции / классы, определенные в текущем файле .h, с динамической c библиотекой "UeiDaqAPI"

__ declspe c (dllimport) не поддерживается linux, поэтому я попробовал обходной путь, используя dlopen (). Для получения дополнительной справочной информации около 40 заголовочных файлов используют приведенный выше вызов __declspe c (), поэтому тестирование любого обходного пути очень утомительно. Мне дали динамическую c библиотеку для linux в формате .so, который я должен использовать.

Я нашел пример использования dlopen (путь к библиотеке), который должен позволять мне обойти вызов __declspe c (), но я не уверен, как заставить его работать правильно. До сих пор я пытался следовать примеру и изменил все 40 или около того заголовочных файлов и заменил вызов __declspe c () следующим:

#ifndef UeiDaqAPI
    string nameOfLibToLoad("path/to/lib/lib.so");
    UeiDaqAPI = dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
    if (!lib_handle) {
        cerr << "Cannot load library: " << dlerror() << endl;
    }
#endif

Однако, я получаю ошибки, утверждающие, что вызовы функций что определенные в заголовочных файлах не определены, я подозреваю, что это связано с тем, что они не добавляются в библиотеку .so, но я не уверен.

Мне нужна помощь в реализации описанного выше обходного пути, или, если есть лучший способ обойти вызов __declspe c (), то идентифицируйте как некоторые указатели того, с чего начать.

1 Ответ

3 голосов
/ 13 января 2020

Вам не нужно использовать dlopen, то есть для динамической c загрузки (LoadLibrary / dlopen, GetProcAddress / dlsym, FreeLibrary / dlclose).

Вместо этого, как в случае Windows в базовом c случае, он должен быть автоматическим c, но синтаксис немного отличается.

Windows / MSV C обычно экспортирует вещи только из DLL, о которых было специально сказано __declspec(dllexport), и затем при использовании DLL пытается связать только то, что явно указано с помощью __declspec(dllimport).

GCC / Linux, однако по умолчанию (вы можете включить в явный стиль экспорта) просто экспортирует все в .so, и при связывании учитывает любой объект или библиотеку, поэтому достаточно просто объявить функцию, как для библиотеки * stati c или нескольких файлов C / C ++.

void my_uei_daq_api_function(int a, int b);

Часто в переносимых библиотеках может быть что-то вроде:

#if defined(_WIN32) && defined(MYLIB_DLL)
#    ifdef MYLIB_BUILD
//       Compiling a Windows DLL
#        define MYLIB_EXPORT __declspec(dllexport)
#    else
//       Using a Windows DLL
#        define MYLIB_EXPORT __declspec(dllimport)
#    endif
// Windows or Linux static library, or Linux so
#else
#    define MYLIB_EXPORT
#endif

, которое затем используется в заголовках библиотек:

MYLIB_EXPORT void my_uei_daq_api_function(int a, int b);
...