myyou
V2EX  ›  Python

golang 编译为.so 库用 Python 调用后报“dlsym(0x7fe2a7d4ea30, background): symbol not found”的错误,请问是什么原因?

By myyou at 2018 年 8 月 10 日 · 3191 次点击
  • golang 代码:
package main

import (
	"C"
	"github.com/360EntSecGroup-Skylar/excelize"
	)

func background(excelname, sheetname, image *C.char) *C.char {
	excelname_go := C.GoString(excelname)
	sheetname_go := C.GoString(sheetname)
	image_go := C.GoString(image)

	xlsx, err := excelize.OpenFile(excelname_go)
	if err != nil {
		panic(err)
	}
    
	xlsx.SetSheetBackground(sheetname_go, image_go)

	err = xlsx.SaveAs(excelname_go)
	if err != nil {
		panic(err)
	}

	return C.CString("success")
}

func main()  {}
import ctypes
from ctypes import cdll

def set_background():
    name = b'/Users/myyou/work/background.xlsx'
    background = cdll.LoadLibrary('/Users/myyou/work/excel.so').background
    background.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
    background.restype = ctypes.c_char_p
    background(name, b'Sheet1', b'/Users/myyou/work/ntim.jpg')
    return 'ok'
  • 调用后发生的错误:
Traceback (most recent call last):
  File "/Users/myyou/work/pythonenv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-24964e319282>", line 1, in <module>
    set_background()
  File "/Users/myyou/work/test.py", line 275, in 
    background = cdll.LoadLibrary('/Users/kamui/work/excel.so').background
  File "/Users/myyou/.pyenv/versions/3.6.2/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
    func = self.__getitem__(name)
  File "/Users/myyou/.pyenv/versions/3.6.2/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x7fe2a7d4ea30, background): symbol not found

而且在编译成.so 库是并没有生成 excel.h 只有 excel.so

2 条回复  •  2018-08-10 16:58:10 +08:00
myyou
   1
myyou  
OP
   2018 年 8 月 10 日
- 自己找到原因了,需要价格注释

```
import ctypes
from ctypes import cdll

//export background
def set_background():
name = b'/Users/myyou/work/background.xlsx'
background = cdll.LoadLibrary('/Users/myyou/work/excel.so').background
background.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
background.restype = ctypes.c_char_p
background(name, b'Sheet1', b'/Users/myyou/work/ntim.jpg')
return 'ok'
```
myyou
   2
myyou  
OP
   2018 年 8 月 10 日
@myyou 注释加错了,应该加载 golang 代码中

```
package main

import (
"C"
"github.com/360EntSecGroup-Skylar/excelize"
)

//export background
func background(excelname, sheetname, image *C.char) *C.char {
excelname_go := C.GoString(excelname)
sheetname_go := C.GoString(sheetname)
image_go := C.GoString(image)

xlsx, err := excelize.OpenFile(excelname_go)
if err != nil {
panic(err)
}

xlsx.SetSheetBackground(sheetname_go, image_go)

err = xlsx.SaveAs(excelname_go)
if err != nil {
panic(err)
}

return C.CString("success")
}

func main() {}

```
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 24ms · 3.9.8.5