Мини инструкция, т.к. потратил пару часов на разрозненной информации.
Библиотека.
Обязательно пишем extern "C". Если не указать, то компилятор добавит символы к имени и функция dsym не найдет ничего.
#ifdef WINDOWS
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C" //__attribute__((visibility ("default")))
#endif // WINDOWS
EXPORT int Add(int a, int b) {
return a + b;
}
Программа в которой загружаем библиотеку
#ifdef WINDOWS
#define IMPORT __declspec(dllimport)
IMPORT int Add(int a, int b);
#else
#define IMPORT
#include <dlfcn.h>
#endif // WINDOWS
#include "TestLinuxSharedLib.h"
using namespace std;
int main()
{
#ifndef WINDOWS
void* handle;
int (*cosine)(int,int);
//void* cosine;
char* error;
handle = dlopen("./libMySharedLib.so", RTLD_NOW);
if (!handle) {
cout << "not found libMySharedLib.so" << endl;
return 1;
}
cosine = (int (*)(int, int))dlsym(handle, "Add");
if ((error = dlerror()) != NULL) {
cout << error << endl;
cout << "error not Add" << endl;
return 1;
}
#endif
int res = (*cosine)(1, 2);
cout << "Hello CMake: " << res << endl;
dlclose(handle);
return 0;
}
Файл сборки:
cmake_minimum_required (VERSION 3.14)
project ("TestLinuxSharedLib")
add_subdirectory(MySharedLib)
add_executable (TestLinuxSharedLib "TestLinuxSharedLib.cpp" "TestLinuxSharedLib.h")
#вместо ключа ликовщика -ldl линкуем с самой библиотекой DL
target_link_libraries(TestLinuxSharedLib ${CMAKE_DL_LIBS})
Библиотека.
Обязательно пишем extern "C". Если не указать, то компилятор добавит символы к имени и функция dsym не найдет ничего.
#ifdef WINDOWS
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C" //__attribute__((visibility ("default")))
#endif // WINDOWS
EXPORT int Add(int a, int b) {
return a + b;
}
Программа в которой загружаем библиотеку
#ifdef WINDOWS
#define IMPORT __declspec(dllimport)
IMPORT int Add(int a, int b);
#else
#define IMPORT
#include <dlfcn.h>
#endif // WINDOWS
#include "TestLinuxSharedLib.h"
using namespace std;
int main()
{
#ifndef WINDOWS
void* handle;
int (*cosine)(int,int);
//void* cosine;
char* error;
handle = dlopen("./libMySharedLib.so", RTLD_NOW);
if (!handle) {
cout << "not found libMySharedLib.so" << endl;
return 1;
}
cosine = (int (*)(int, int))dlsym(handle, "Add");
if ((error = dlerror()) != NULL) {
cout << error << endl;
cout << "error not Add" << endl;
return 1;
}
#endif
int res = (*cosine)(1, 2);
cout << "Hello CMake: " << res << endl;
dlclose(handle);
return 0;
}
Файл сборки:
cmake_minimum_required (VERSION 3.14)
project ("TestLinuxSharedLib")
add_subdirectory(MySharedLib)
add_executable (TestLinuxSharedLib "TestLinuxSharedLib.cpp" "TestLinuxSharedLib.h")
#вместо ключа ликовщика -ldl линкуем с самой библиотекой DL
target_link_libraries(TestLinuxSharedLib ${CMAKE_DL_LIBS})
Комментарии
Отправить комментарий