【问题标题】:I can PInvoke C++ executable but not shared Library我可以 PInvoke C++ 可执行文件但不能共享库
【发布时间】:2019-10-03 04:58:35
【问题描述】:

我确实有一个 .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

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

现在,如果我尝试将此 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 文件而不是可执行文件?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2019-11-16
      • 2011-12-14
      • 2014-01-14
      • 2016-09-08
      • 1970-01-01
      • 2017-06-18
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多