我可以 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
我有一个 .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