首页 > 解决方案 > 多个.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 mystrtest.cpp :

// in test.cpp
string mystr;

// in cls.cpp
extern string mystr;

(当然我删除了头文件中的extern)

如何共享全局变量?它们不需要从 python 访问,因为它们只应该由 C++ 模块使用

谢谢

标签: pythonc++boostglobal-variablesextern

解决方案


推荐阅读