这是我的例子,我有main.c,dlopens lib1.so和链接lib2.so时链接.
lib1.so需要调用一个定义的函数lib2.so,如下所示:
main.c中
extern void func2();
int main(){
void *handle;
void (*lib1)();
handle = dlopen("./lib1.so", RTLD_LAZY);
*(void**)(&lib1) = dlsym(handle, "lib1");
if(!lib1){
printf("Can't find lib1\n");
}
else{
func1();
dlclose(handle);
}
//func2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
lib1.c
extern void func2();
void func1(){
printf("Function1\n");
func2();
}
Run Code Online (Sandbox Code Playgroud)
lib2.c
void func2(){
printf("Function2\n");
}
Run Code Online (Sandbox Code Playgroud)
我以前编译主要是悲伤的
gcc -rdynamic main.c -o main lib2.so -ldl
Run Code Online (Sandbox Code Playgroud)
但是当我跑main我得到的undefined symbol: lib2,但如果我删除评论//func2()中的main.c(所以我简单地调用func2()至少一次main …
如何将 pkg-config 添加到以下内容setup.py(例如,如果我想添加glib-2.0)
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
wrapper = Extension(
name="wrapper",
sources=["wrapper.pyx"],
libraries=["library"],
library_dirs=["builddir/lib"],
include_dirs=["lib"]
)
setup(
name="wrapper",
ext_modules=cythonize([wrapper])
)
Run Code Online (Sandbox Code Playgroud)
我可以按如下方式执行此操作,但我不想使用路径(/usr/lib/x86_64-linux-gnu/和/usr/include/glib-2.0)并使其可移植
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
wrapper = Extension(
name="wrapper",
sources=["wrapper.pyx"],
libraries=["library"],
library_dirs=["builddir/lib", "/usr/lib/x86_64-linux-gnu/"],
include_dirs=["lib", "/usr/include/glib-2.0"]
)
setup(
name="wrapper",
ext_modules=cythonize([wrapper])
)
Run Code Online (Sandbox Code Playgroud) 这是我的设置.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
wrapper = Extension(
name="libwrapper",
...
)
setup(
name="libwrapper",
ext_modules=cythonize([wrapper])
)
Run Code Online (Sandbox Code Playgroud)
当我运行python3 setup.py build_ext输出文件时,称为libwrapper.cpython-36m-x86_64-linux-gnu.so,但我只想命名它libwrapper.so,我该怎么做?
我用这种方式创建了一个共享库
gcc -I/home/lib 'pkg-config --cflags gtk+-2.0 libxml-2.0' -shared -fPIC -Wl,--export-dynamic file1.c file2.c -o lib.so
Run Code Online (Sandbox Code Playgroud)
它有效,并且创建的库也可以满足我的需要。我想知道编译和链接在这个命令字符串中的位置,所以请向我解释一下,并告诉我一种将它们划分为两个不同命令的方法,以便更好地理解。我需要理解这一点,因为我无法解释为什么这个库可以工作,即使它必须链接到另一个我从未链接过的库。
这两个不同的程序之间有性能差异吗?
#define K 50
void main() {
int k = K;
}
Run Code Online (Sandbox Code Playgroud)
void main() {
int k = 50;
}
Run Code Online (Sandbox Code Playgroud) c ×3
distutils ×2
gcc ×2
python ×2
setup.py ×2
cython ×1
distutils2 ×1
memory ×1
performance ×1
pkg-config ×1
preprocessor ×1
python-3.x ×1