C# 我可以用PInvoke C++;可执行但非共享库

C# 我可以用PInvoke C++;可执行但非共享库,c#,c++,c++11,g++,pinvoke,C#,C++,C++11,G++,Pinvoke,我有一个.cpp文件,当我使用下面的命令将其转换为可执行文件时: g++-std=c++11 command.cpp-o command-lsomereference 如果我理解正确,那么它会将command.cpp编译成一个名为command的可执行文件,并且在执行时,它会链接名为somereference的外部引用。如果我的理解有任何错误,请纠正我 这很有效。事实上,如果我从编译命令中删除-lsomereference,那么它会抛出大量链接错误,这告诉我显式链接到somereferenceu

我有一个.cpp文件,当我使用下面的命令将其转换为可执行文件时:

g++-std=c++11 command.cpp-o command-lsomereference

如果我理解正确,那么它会将
command.cpp
编译成一个名为
command
的可执行文件,并且在执行时,它会链接名为
somereference
的外部引用。如果我的理解有任何错误,请纠正我

这很有效。事实上,如果我从编译命令中删除
-lsomereference
,那么它会抛出大量链接错误,这告诉我显式链接到
somereference
uising
-lsomereference
标志很重要

现在,我可以在我的C#程序中引用这个可执行文件,并将p/Invoke引入到主函数中。因此,它一直适用于C代码

现在,我的计划是将它用作一个p/可调用库,所以基本上我需要的不是一个可执行文件,而是一个共享库

所以在搜索之后,我意识到我必须使用
-c flag
来创建一个共享库,我使用了下面的命令:

g++-std=c++11 command.cpp-o command.so-c

使用此命令,我无法显式链接-lsomereference,因为-c标志将忽略链接

现在,如果我尝试将这个command.so文件引用到我的C#程序中,那么它将失败,并出现以下错误:

command.so'或其依赖项之一。为了帮助诊断加载问题,请考虑设置DydLPrimtLoCub环境变量:

我不知道可执行文件与.so文件(我猜可执行文件是通过显式链接编译的)和共享库(command.so)文件之间发生了什么剧烈的变化,这可能是问题所在


什么可以破坏command.so文件而不是可执行文件?

-c
标志告诉gcc编译给定文件,但不链接任何内容。 您所做的是编译成一个对象文件(.o),并给它一个不同的扩展名

您要查找的标志是
-fPIC-shared

试试这个:
g++-std=c++11-fPIC-shared command.cpp-lsomereference-o command.so