我有一个非常简单的代码示例:
#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;
}
答案 0 :(得分:0)
当您的程序加载并初始化时,操作系统会在相应的目录中搜索所需的共享库(例如/ usr / lib或%WINDIR%\ system32)*。
如果那些目录中不存在该库,则应用程序将不会运行,因为不满足依赖性。您的示例可能建议您使用dlopen
从应用程序所在的同一目录加载共享库 - 您可能无法在没有管理员权限的情况下将共享库复制到默认路径中。
*通常您可以添加更多要搜索的路径,但这些路径是默认路径