#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 работает.