繁体   English   中英

共享库和静态库之间的用法差异

[英]Difference of usage between shared and static library

我有一个非常简单的代码示例:

#include<iostream>
#include "libMPSSE_spi.h"

int main() {
   uint32 channels = 0;
   std::cout << "erreur = " <<  SPI_GetNumChannels(&channels) << std::endl;
   std::cout << "Number of available SPI channels = " << (int)channels << std::endl;
   return 0;
}

当我链接静态libMPSSE时,这种方法很好用,但是共享库有问题。

我创建文件的两个命令是:

g++ test.cpp -o test.o -I../../libs/MPSSE -I../../libs/FTDI/linux -L../../libs/MPSSE/linux/x64 -lMPSSE

g++ test.cpp -o test.o -I../../libs/MPSSE -I../../libs/FTDI/linux ../../libs/MPSSE/linux/x64/libMPSSE.a -ldl

两种编译均有效,但执行输出不相同。 使用静态链接,库可以正常工作,而使用动态链接,则库会返回“其他错误”。

注意:我已经使用提供的makefile自己构建了两个库(两个库都以相同的方式构建了对象):

libMPSSE:   $(OBJECTS)
    $(CC)  -o libMPSSE.so -shared $(OBJECTS) -L /MinGW/lib -ldl
    $(AR) rcs libMPSSE.a $(OBJECTS)

有什么可以解释这两个库的不同行为?

注意:在他们提供的库示例中,他们将共享库与dlopen一起使用,但是如果我在链接时拥有库和标头,则不必这样做吗?

注意2:它们都使用libftd2xx.so,我使用此命令运行可执行文件(动态和静态)

LD_LIBRARY_PATH=~/WS/Qt/main/LC4/main/libs/FTDI/linux/x64:~/WS/Qt/main/LC4/main/libs/MPSSE/linux/x64 ./test.o
LD_LIBRARY_PATH=~/WS/Qt/main/LC4/main/libs/FTDI/linux/x64 ./test.o

编辑:与共享库一起使用的代码(来自其示例)

#include <iostream>
#include "libMPSSE_spi.h"
#include <dlfcn.h>


int main() {

    typedef FT_STATUS (*pfunc_SPI_GetNumChannels)(uint32 *numChannels);
    pfunc_SPI_GetNumChannels p_SPI_GetNumChannels;
    void *h_libMPSSE;

    h_libMPSSE = dlopen("../../libs/MPSSE/linux/x64/libMPSSE.so",RTLD_LAZY);
    if(!h_libMPSSE)
    {
        std::cout <<"Failed loading libMPSSE.so. Please check if the file exists in ";
        std::cout << "the shared library folder(/usr/lib or /usr/lib64)" << std::endl;
        return 1;
    }
    p_SPI_GetNumChannels = (pfunc_SPI_GetNumChannels)dlsym(h_libMPSSE, "SPI_GetNumChannels");

   uint32 channels = 0;
   std::cout << "erreur = " <<  p_SPI_GetNumChannels(&channels) << std::endl;
   std::cout << "Number of available SPI channels = " << (int)channels << std::endl;
   return 0;
}

在加载和初始化程序后,操作系统会在适当的目录(例如/ usr / lib或%WINDIR%\\ system32)*中搜索所需的共享库。

如果这些目录中不存在该库,则由于不满足依赖关系,该应用程序将无法运行。 您的示例可能建议您使用dlopen从应用程序所在的目录中加载共享库-如果没有管理员权限,您可能无法将共享库复制到默认路径中。

*通常您可以添加更多要搜索的路径,但是这些是默认路径

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM