setuptools 和 cffi:如何更改库路径
setuptools and cffi: how to change the library path
我正在使用 cffi 创建一个 python 程序来测试我的 C/ASM 库与真正的 libc 函数。
我尝试使用 setuptools 来设置我不同的 cffi 模块。所以这是我的文件树:
这是我的 libftasm_builder.py:
from cffi import FFI
ffiBuilder = FFI()
ffiBuilder.cdef("""
void ft_bzero(void *s, size_t n);
char *ft_strcat(char *dest, const char *src);
int ft_isalpha(int c);
int ft_isdigit(int c);
int ft_isalnum(int c);
int ft_isascii(int c);
int ft_isprint(int c);
int ft_toupper(int c);
int ft_tolower(int c);
int ft_puts(const char *s);
size_t ft_strlen(const char *s);
void *ft_memset(void *s, int c, size_t n);
void *ft_memcpy(void *dest, const void *src, size_t n);
char *ft_strdup(const char *s);
void ft_cat(int fd);
int ft_islower(int c);
int ft_isupper(int c);
""")
ffiBuilder.set_source("_libasm_cffi",
"""
#include "libftasm.h"
""",
include_dirs=['/Users/sle-lieg/libasm/libftasm/header/'],
library_dirs=['/Users/sle-lieg/libasm/libftasm/'],
libraries=['ftasm']
)
if __name__ == "__main__":
ffiBuilder.compile(verbose=True)
和我的 setup.py:
from setuptools import setup
setup(
setup_requires=["cffi>=1.0.0"],
cffi_modules=[
"libftasm_builder.py:ffiBuilder",
"libc_builder.py:ffiBuilder"
],
install_requires=["cffi>=1.0.0"]
)
所以它构建得很好,正如你在文件树中看到的那样我有我的 cffi_files,但是当我尝试执行我的 libasm_tester.py 时,我有这个错误:
Traceback (most recent call last):
File "libasm_tester.py", line 4, in <module>
from _libasm_cffi import ffi, lib
ImportError: dlopen(/Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/_libasm_cffi.abi3.so, 2): Library not loaded: libftasm.dylib
Referenced from: /Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/_libasm_cffi.abi3.so
Reason: image not found
我不明白为什么它会尝试从 build/lib/_libasm_cffi.abi3.so 打开库,因为我告诉 libasm_builder:
library_dirs=['/Users/sle-lieg/libasm/libftasm/']
我在这里错过了什么? :( 。谢谢你!!
[编辑]
在我的 libasm_tester.py 中,我必须将其添加到我的文件顶部才能导入 cffi_modules:
import sys
sys.path.insert(0, '/Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/')
from _libasm_cffi import ffi, lib
from _libc_cffi import lib as libC
也许是这个原因?但如果我不添加它,我将无法导入 cffi 模块...
确定找到解决方案:
export DYLD_LIBRARY_PATH=/path/to/your/lib
这显然是有道理的,因为该库不在 dlopen() 使用的默认路径中 ...
我正在使用 cffi 创建一个 python 程序来测试我的 C/ASM 库与真正的 libc 函数。
我尝试使用 setuptools 来设置我不同的 cffi 模块。所以这是我的文件树:
这是我的 libftasm_builder.py:
from cffi import FFI
ffiBuilder = FFI()
ffiBuilder.cdef("""
void ft_bzero(void *s, size_t n);
char *ft_strcat(char *dest, const char *src);
int ft_isalpha(int c);
int ft_isdigit(int c);
int ft_isalnum(int c);
int ft_isascii(int c);
int ft_isprint(int c);
int ft_toupper(int c);
int ft_tolower(int c);
int ft_puts(const char *s);
size_t ft_strlen(const char *s);
void *ft_memset(void *s, int c, size_t n);
void *ft_memcpy(void *dest, const void *src, size_t n);
char *ft_strdup(const char *s);
void ft_cat(int fd);
int ft_islower(int c);
int ft_isupper(int c);
""")
ffiBuilder.set_source("_libasm_cffi",
"""
#include "libftasm.h"
""",
include_dirs=['/Users/sle-lieg/libasm/libftasm/header/'],
library_dirs=['/Users/sle-lieg/libasm/libftasm/'],
libraries=['ftasm']
)
if __name__ == "__main__":
ffiBuilder.compile(verbose=True)
和我的 setup.py:
from setuptools import setup
setup(
setup_requires=["cffi>=1.0.0"],
cffi_modules=[
"libftasm_builder.py:ffiBuilder",
"libc_builder.py:ffiBuilder"
],
install_requires=["cffi>=1.0.0"]
)
所以它构建得很好,正如你在文件树中看到的那样我有我的 cffi_files,但是当我尝试执行我的 libasm_tester.py 时,我有这个错误:
Traceback (most recent call last):
File "libasm_tester.py", line 4, in <module>
from _libasm_cffi import ffi, lib
ImportError: dlopen(/Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/_libasm_cffi.abi3.so, 2): Library not loaded: libftasm.dylib
Referenced from: /Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/_libasm_cffi.abi3.so
Reason: image not found
我不明白为什么它会尝试从 build/lib/_libasm_cffi.abi3.so 打开库,因为我告诉 libasm_builder:
library_dirs=['/Users/sle-lieg/libasm/libftasm/']
我在这里错过了什么? :( 。谢谢你!!
[编辑]
在我的 libasm_tester.py 中,我必须将其添加到我的文件顶部才能导入 cffi_modules:
import sys
sys.path.insert(0, '/Users/sle-lieg/libasm/libftasm/lib_tester/build/lib.macosx-10.12-x86_64-3.7/')
from _libasm_cffi import ffi, lib
from _libc_cffi import lib as libC
也许是这个原因?但如果我不添加它,我将无法导入 cffi 模块...
确定找到解决方案:
export DYLD_LIBRARY_PATH=/path/to/your/lib
这显然是有道理的,因为该库不在 dlopen() 使用的默认路径中 ...