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

I can PInvoke C++ executable but not shared Library

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

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

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

这很管用。事实上,如果我从我的编译命令中删除 -lsomereference 那么它会抛出很多 linking 错误,这告诉我显式 linking 到 somereference uisng -lsomereference 标志很重要。

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

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

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

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

使用此命令我不能明确地 link -lsomereference 因为 -c 标志它将忽略 linking.

现在,如果我尝试将此 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 文件之间发生了什么巨大变化(我的猜测是可执行文件是使用显式 linking 编译的)和共享库(command.so)文件是编译的使用 -c 标志可能是问题所在。

什么可能会破坏 command.so 文件但不会破坏可执行文件?

-c 标志告诉 gcc 编译给定的文件,而不是 link 任何东西。 您所做的是编译成目标文件 (.o) 并为其指定不同的扩展名。

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

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