Загрузка библиотеки c из c# с помощью pinvoke на ядре dotnet

#c# #c #.net-core #pthreads #pinvoke

Вопрос:

Я создал следующую библиотеку c:

 #define _GNU_SOURCE #include lt;pthread.hgt; #include lt;sched.hgt;  int attachCurrentThreadToCore(int core);  int main(void) {  return 0; }  int attachCurrentThreadToCore(int core) {   pthread_t thread;   thread = pthread_self();   cpu_set_t set;   CPU_ZERO(amp;set);   CPU_SET(core, amp;set);   return pthread_setaffinity_np(thread, sizeof(cpu_set_t), amp;set); }  

и теперь я пытаюсь вызвать attachCurrentThreadToCore.

Это мой тестовый код pinvoke:

 [DllImport("/home/anon/Documents/RadFramework/RadFramework.Libraries.Threading/src/TestProject1/bin/Debug/net5.0/pthreadWrapper")]    private static extern int attachCurrentThreadToCore(int core);    [Test]  public void Test1()  {  attachCurrentThreadToCore(0);  while (true)  {  }  }  

Теперь я ожидал бы, что ядро 1 на моей машине будет вращаться в цикле while. Вместо этого я получаю это исключение при пинвокинге:

Не удается загрузить общую библиотеку ‘/главная страница/анон/Документы/RadFramework/RadFramework.Библиотеки.Поток/src/TestProject1/bin/Debug/net5.0/pthreadWrapper’ или одна из его зависимостей. Чтобы помочь диагностировать проблемы с загрузкой, рассмотрите возможность установки переменной среды LD_DEBUG: /home/anon/Documents/RadFramework/RadFramework.Библиотеки.Поток/src/TestProject1/bin/Debug/net5.0/pthreadWrapper: не удается динамически загрузить исполняемый файл, не зависящий от позиции

Я думаю, что это сводится к «не удается динамически загружать исполняемый файл, не зависящий от позиции».

Есть ли что-нибудь еще, что мне нужно сделать при компиляции моей библиотеки c?

Заранее спасибо 🙂

Комментарии:

1. Какую команду компиляции вы использовали для создания своей «библиотеки» c (исполняемого файла?)?

2. создайте файл всего здания: ../src/pthreadWrapper.c Вызов: Перекрестный компилятор GCC gcc-O0-g3-Стена-c-fmessage-длина=0-MMD-MP-MF»src/pthreadWrapper.d» -MT»src/pthreadWrapper.o» -o «src/pthreadWrapper.o» «../src/pthreadWrapper.c» Готовое здание: ../src/pthreadWrapper.c Цель построения: pthreadWrapper Вызов: Перекрестный компоновщик GCC gcc-o «pthreadWrapper» ./src/pthreadWrapper.o-lpthread Цель завершения построения: pthreadWrapper

3. @omajid Это мой вывод сборки gcc в eclipse 🙂

4. Обычно вам нужно будет включить библиотеку в качестве собственной библиотеки в свой проект и скопировать ее в выходную папку «bin». Затем вы просто включаете его относительно своей сборки. Не забудьте «.dll»-суффикс.

5. Я попробовал еще раз, и это ничего не изменило, извините. Я думаю, что это связано с процессом компиляции моей библиотеки.

Ответ №1:

Изменил артефакт сборки в eclipse с исполняемого файла на библиотеку:

Затмение

Это приводит к такому выводу сборки:

создайте файл всего здания: ../src/pthreadWrapper.c Вызов: Перекрестный компилятор GCC gcc-O0-g3-Стена-c-fmessage-длина=0-MMD-MP-MF»src/pthreadWrapper.d» -MT»src/pthreadWrapper.o» -o «src/pthreadWrapper.o» «../src/pthreadWrapper.c» Готовое здание: ../src/pthreadWrapper.c

Цель строительства: libPthreadWrapper.so Вызов: Перекрестный компоновщик GCC gcc -общий доступ-o «libPthreadWrapper.so» ./src/pthreadWrapper.o -цель создания lpthread завершена: libPthreadWrapper.so

После этого pinvoke работает.