我可以PInvoke C ++可执行文件,但不能共享库

时间:2019-05-16 01:38:30

标签: c# c++ c++11 g++ pinvoke

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

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

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

这很好。实际上,如果我从编译命令中删除-lsomereference,那么它会引发很多链接错误,这表明我明确地链接到somereference uisng -lsomereference标志很重要。

现在,我可以在C#程序中引用此可执行文件,并P / Invoke进入主要功能。因此它一直适用于C#代码。

现在,我的计划是将其用作P / Invokable库,因此基本上我需要的不是可执行文件,而是实际上的共享库

因此,在搜索它之后,意识到我必须使用-c flag创建一个共享库,并且我使用了以下命令:

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

使用此命令,由于-c标志,我无法显式链接-lsomereference。

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

command.so' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable:

我不知道可执行文件和.so文件之间有什么巨大变化(我猜是可执行文件是通过显式链接编译的)和共享库(command.so)文件是使用-c标志编译的问题。

可能会破坏command.so文件而不是可执行文件吗?

1 个答案:

答案 0 :(得分:1)

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

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

尝试一下: g++ -std=c++11 -fPIC -shared command.cpp -lsomereference -o command.so