Я могу PInvoke C ++ исполняемый, но не разделяемая библиотека - PullRequest
0 голосов
/ 16 мая 2019

У меня есть один файл .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, но не исполняемый файл?

1 Ответ

1 голос
/ 16 мая 2019

Флаг -c указывает gcc компилировать данный файл, но не связывать что-либо. Что вы сделали, это скомпилировали в объектный файл (.o) и дали ему другое расширение.

Флаги, которые вы ищете: -fPIC -shared.

Попробуйте это: g++ -std=c++11 -fPIC -shared command.cpp -lsomereference -o command.so

...