我确实有一个.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文件而不是可执行文件吗?
答案 0 :(得分:1)
-c
标志告诉gcc编译给定的文件,但不链接任何文件。
您要做的是编译为目标文件(.o),并给它一个不同的扩展名。
您要查找的标志是-fPIC -shared
。
尝试一下:
g++ -std=c++11 -fPIC -shared command.cpp -lsomereference -o command.so