簡體   English   中英

使用 cppyy 從 python 調用 C++ function

[英]Calling C++ function from python with cppyy

我需要使用 cppyy 從 Python 中的第 3 方 C++ 庫中調用函數。 首先,我寫了一個簡單的 C++ function 並嘗試將其加載到 Python 中:

測試.hpp

class Test {
    public:
        void test();
};

測試.cpp

#include <iostream>
#include "test.hpp"

void Test::test() {
    std::cout << "Hello World!" << std::endl;
}

然后,我使用以下命令行創建test.dll (我現在在 Windows 上,但最終項目應該在帶有 Z3D945423F8E9496C429A5D8C605B4604FZ 的 Jetson Nano 上運行):20。

g++ -shared test.hpp test.cpp -o testlib.dll

測試.py

import cppyy

cppyy.include('test.hpp')
cppyy.load_library('testlib.dll')

from cppyy.gbl import Test

t = Test()
t.test()

此代碼在最后一行t.test()崩潰,並出現以下錯誤:

IncrementalExecutor::executeFunction: symbol '?Y@X@@QEAAXXZ' unresolved while linking symbol '__cf_8'!
You are probably missing the definition of public: void __cdecl X::Y(void) __ptr64
Maybe you need to load the corresponding shared library?

我試圖在網上尋找解決方案,但沒有找到太多,我唯一嘗試的是在 class 定義中添加__declspec(dllexport)但這沒有幫助,而且我之前從未真正使用過 C++ 並且不能了解 rest 的大部分內容,因此將不勝感激。

先感謝您。

這純粹是一個 Windows 問題:默認情況下,它使符號在共享庫之外不可見,您需要顯式導出它們。 其他平台,例如 Linux,則相反:默認情況下可見,如果需要,您需要將符號聲明為隱藏。 MSVC 可以為您生成導出文件,以使所有符號默認可見(並且cmake提供了一個簡單的實用程序),但我不確定gcc上的 gcc 是否支持這一點。

(您寫道,這是針對3rd-party C++ library的?如果是您無法修改源的情況,那么這是最好的選擇。如果您只有二進制文件,那么它們必須已經支持符號,或者那些即使從 C++ 庫也無法使用。)

使用__declspec(dllexport)確實是可能的,但需要注意:如果 header 被構建共享庫的編譯器看到,那么它就是dllexport 當 Cling 看到時,它是dllimport 就像是:

#ifdef _WIN32
#ifdef __CLING__
#define MY_PROJECT_EXTERN extern __declspec(dllimport);
#else
#define MY_PROJECT_EXTERN extern __declspec(dllexport);
#endif
#else
#define MY_PROJECT_EXTERN extern
#endif

雖然更常見的做法是顛倒邏輯。 也就是說,在 Windows 上構建共享庫時,使用#ifdef MY_PROJECT_INTERNAL或類似的東西代替#ifdef __CLING__並定義MY_PROHECT_INTERNAL 要點是,對於使用 header 文件和項目庫的任何其他 C++ 項目來說,這是一個普遍問題,而不是特定於 Cling 的問題。 (而且因為這是一個普遍問題,我懷疑第 3 方庫已經提供了類似的東西,如果它打算在 Windows 上使用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM