gpt4 book ai didi

c++ - 共享库和静态库的用法区别

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:18 25 4
gpt4 key购买 nike

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

#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 一起使用,但如果我在链接时有库和 header ,我就不必这样做了吗?

注意 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 从应用程序所在的同一目录加载共享库 - 如果没有管理员权限,您可能无法将共享库复制到默认路径。

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

关于c++ - 共享库和静态库的用法区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41304721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com