如下面这个程序使用ldd查看下:
从中可以看到一些so.6和so.1这些,这些其实是版本号,比如这个:/lib64/libstdc++.so.6
可见so.版本号其实是个软连接,最终会连接到/lib64/libstdc++.so.6.0.19
而C++Qt框架写的lib如下pro文件会生生成4个so,make后,就可以看到其实有3个是执行那1个的软连接
DEFINES += APP
#DEFINES += LIB
QT += core
QT -= gui
CONFIG += c++11
TARGET = XXXLib
CONFIG += console
CONFIG -= app_bundle
QMAKE_CXXFLAGS += -fpermissive
contains(DEFINES, APP){
SOURCES += main.cpp
TEMPLATE = app
QMAKE_POST_LINK += scp programName root@192.168.1.100:/root/bin
}
else{
TEMPLATE = lib
DEFINES += LIBXXX_LIBRARY
HEADERS += libXXX_global.h
}
SOURCES += ...... \
...... \
......
unix{
INCLUDEPATH += ...... \
...... \
......
LIBS += -L/XXXX/XXXX/XXXX/XXXX-lxxxx_lib -lxxxx_lib -lxxxx_lib
}
DEFINES += QT_DEPRECATED_WARNINGS
HEADERS += ...... \
...... \
...... \
......
如下命令:
ln -s libXXXLib.so.1.0.0 libXXXLib.so
ln -s libXXXLib.so.1.0.0 libXXXLib.so.1
ln -s libXXXLib.so.1.0.0 libXXXLib.so.1.0
如果是这样的,那么需要把这些都拷贝到对应的lib目录下,其他程序调用的时候一般不会直接链接到libXXXLib.so,会链接到so.版本号的程序所以有时就会出现error while loading shared libraries .... not found。
如果不需要Qt生成版本控制,只要单独的so,在pro文件中添加:
CONFIG += plugin
即可。
再说明下,如果有个程序,能跑,有源码,没有文档。
领导让你从中扣出某个功能,再进行一些业务操作,变成新的程序,而要扣的某些功能,有的用了公司其他人开发的so。
可以从以下2个方面入手:
①查看makefile,把链接到的so和include直接写到新项目中;
②使用ldd,查看程序链接到哪些dll,在国内,写的so一般都没有版本号,没有链到版本号的so要特别注意;
最后屁股能坐得住椅子,慢慢测。