在 dotnet 核心上使用 pinvoke 从 C# 加载 C 库

Loading c library from c# with pinvoke on dotnet core

我构建了以下 c 库:

#define _GNU_SOURCE
#include <pthread.h>
#include <sched.h>

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(&set);

    CPU_SET(core, &set);

    return pthread_setaffinity_np(thread, sizeof(cpu_set_t), &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 循环中旋转。相反,我在调用时收到此异常:

无法加载共享库“/home/anon/Documents/RadFramework/RadFramework.Libraries.Threading/src/TestProject1/bin/Debug/net5.0/pthreadWrapper”或其依赖项之一。为了帮助诊断加载问题,考虑设置 LD_DEBUG 环境变量:/home/anon/Documents/RadFramework/RadFramework.Libraries.Threading/src/TestProject1/bin/Debug/net5.0/pthreadWrapper: cannot dynamically load position-independent executable

我认为它归结为“无法动态加载与位置无关的可执行文件”。

编译我的c库时我还需要做些什么吗?

提前致谢:)

将 eclipse 中的构建工件从可执行文件更改为库:

这会导致生成输出:

使所有 构建文件:../src/pthreadWrapper.c 调用:交叉 GCC 编译器 gcc -O0 -g3 -Wall -c -fmessage-length=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 -shared -o "libPthreadWrapper.so" ./src/pthreadWrapper.o -lpthread 完成建筑目标:libPthreadWrapper.so

之后 pinvoke 开始工作了。