python - 多个.cpp文件共享的Boost / Python全局字符串变量导致未定义的符号错误
问题描述
我有一个全局变量,我试图在多个 .cpp 文件之间共享。根据我对 C++ 的理解,如果我想访问一个全局变量,我需要将其声明为extern
( source )
在 test.h 中:
#pragma once
#include <string>
#include <python3.6m/Python.h>
#include <boost169/boost/python.hpp>
using namespace std;
extern string mystr;
void setString(string s);
测试.cpp
#include "test.h"
using namespace std;
using namespace boost::python;
void setString(string s){
mystr = s;
}
BOOST_PYTHON_MODULE(Test){
def("setString", &setString);
}
cls.cpp(包含类的文件)
#include "test.h"
#include <python3.6m/Python.h>
#include <boost169/boost/python.hpp>
using namespace std;
using namespace boost::python;
class MyTest{
public:
MyTest(){
}
void printString(){
cout << mystr;
}
};
BOOST_PYTHON_MODULE(Cls){
class_<MyTest, MyTest*>("MyTest", init<>())
.def("printString", &MyTest::printString);
}
生成文件:
CC = g++ -O3 -std=c++11
FLAGS = -g -c -Wall
LIBS = -lpython3.6m -lboost_python3
LIBDIR = -L /lib64 -L /lib64/boost169
PY3 = -I/usr/include/python3.6m
cls.o:cls.cpp
$(CC) -fPIC $(PY3) cls.cpp -c $(LIBS)
Cls.so:cls.o
$(CC) $(LIBDIR) -shared cls.o -o Cls.so $(LIBS)
test.o:test.cpp
$(CC) -fPIC $(PY3) test.cpp -c $(LIBS)
Test.so:test.o
$(CC) $(LIBDIR) -shared test.o -o Test.so $(LIBS)
最后,在 python 文件中:
from Test import *
from Cls import *
这给出了一个错误:
File "test/test.py", line 1, in <module>
from Test import *
ImportError: test/Test.so: undefined symbol: mystr
我已尝试按照本文中的建议将其移至string mystr
test.cpp :
// in test.cpp
string mystr;
// in cls.cpp
extern string mystr;
(当然我删除了头文件中的extern)
如何共享全局变量?它们不需要从 python 访问,因为它们只应该由 C++ 模块使用
谢谢
解决方案
推荐阅读
- ag-grid - 第一个字母总是用英文写的
- javascript - Chrome 和 Safari 关闭选项卡事件未在 vue 应用程序中触发
- elasticsearch - Elasticsearch,更新apm的索引管理策略
- emacs - 找不到 Mu4e (emacs)
- jupyter-notebook - JupyterLab:如何从 Javascript 前端触发对 python 后端的回调函数
- android-studio - 菜单抽屉内的接近开关按钮
- python - 索引返回目标值的第一个字母而不是目标值
- python - 收到错误:“TypeError:无法处理此数据类型:(1、1、3),
这是一段代码,目的是从图像中删除像素。我是 python 新手,我不确定这是否是正确的解决方案。我想出的解决方案是将数组转换为二维列表并删除每个像素(我尝试了 np.delete,但它一直抱怨数组必须是矩形),然后返回数组,然后返回如下图所示。
import numpy as np from PIL import Image def remove
- javascript - 箭头函数与普通函数
- github-actions - 如何以 root 身份运行 github runner