小编use*_*893的帖子

如何在未与其直接连接的其他库中调用库函数?

这是我的例子,我有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 …

c gcc shared-libraries

6
推荐指数
1
解决办法
73
查看次数

如何将 pkg-config 添加到 Cython 包装器的 setup.py

如何将 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)

python distutils pkg-config cython setup.py

4
推荐指数
1
解决办法
758
查看次数

更改 setup.py 中的输出文件名(distutils.extension)

这是我的设置.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,我该怎么做?

python distutils setup.py python-3.x distutils2

4
推荐指数
1
解决办法
1882
查看次数

gcc编译和链接

我用这种方式创建了一个共享库

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)

它有效,并且创建的库也可以满足我的需要。我想知道编译和链接在这个命令字符串中的位置,所以请向我解释一下,并告诉我一种将它们划分为两个不同命令的方法,以便更好地理解。我需要理解这一点,因为我无法解释为什么这个库可以工作,即使它必须链接到另一个我从未链接过的库。

c gcc shared-libraries

3
推荐指数
2
解决办法
3万
查看次数

C 性能:宏与常量

这两个不同的程序之间有性能差异吗?

#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 memory performance preprocessor

0
推荐指数
1
解决办法
79
查看次数