• 13838阅读
  • 6回复

求解:怎么实现动态库文件从windows(.dll)下移植到linux环境(.so)? [复制链接]

上一主题 下一主题
离线ccnuliughai
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-31
— 本帖被 XChinux 执行加亮操作(2010-09-03) —
目前,在windows下有一个使用VS 2008编写的动态链接库工程,该工程比较大,最终将生成一个动态库.dll文件。程序是用标准的C++ 编写的,里边好像用了一个Qt 库。现在,需要将该工程中所包含的功能拿来到linux下运用,也即需要将工程搬到linux下重新编译生成一个可在linux下调用的动态库.so文件。

请问:需要怎么对之前已经编好的程序(头文件?源文件?)进行修改,才能达到这个目的?
是不是需要更改某个重定位的声明?看过一些相关文章,不是特别明白。小生在linux下使用Qt creator这个IDE。
离线ccnuliughai
只看该作者 1楼 发表于: 2010-08-31
希望各位牛人大侠不吝赐教!
离线XChinux

只看该作者 2楼 发表于: 2010-08-31
了解在win下和 linux正编写DLL的差异(搜索专门的帖子学习吧),以及程序中与平台相关部分的细节即可(需要对代码及各平台的API,及其差异有了解)。
然后进行修改移植。

都用编译预处理进行分隔处理。比如:


#ifdef Q_WS_WIN

// win code

#else

// linux code
#endif

等等。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线ccnuliughai
只看该作者 3楼 发表于: 2010-09-01
版主,首先非常感谢你的指点。关于动态库,我之前是看过学习的。
因为是头一回进行程序移植,所以,还不是很清楚该怎样处理,冒昧在此打扰了。
动态库的资料,我正在继续认真研读,希望能有所收获。

另外,关于版主所说的“编译预处理进行分隔处理”,这个小生冒昧,不是很明白呢,能说的通俗详细些么?谢谢啦!
离线XChinux

只看该作者 4楼 发表于: 2010-09-01
下面是一个DLL的头文件,注意红色部分


/**
* BPMS2框架通用助手类
* @copyright   北京源创兴业科技有限公司 保留所有权利
* @author      XChinux<XChinux@163.com>
* @version     2.0
* @final       2008-11-25
*/
#ifndef CHINUXTEAM_LIBCOMMON_HPP
#define CHINUXTEAM_LIBCOMMON_HPP
#include <QtGlobal>
#ifdef Q_WS_WIN
#ifdef BUILDING_COMMON_DLL
#define CTDLL_COMMON_API __declspec(dllexport)
#else
#define CTDLL_COMMON_API __declspec(dllimport)
#endif  // BUILDING_TSCOMM_DLL
#else
#define CTDLL_COMMON_API
#endif  // Q_WS_WIN

#include <QtCore>
#include <QtGui>
#include <QtSql>
#include <QtNetwork>
namespace ChinuxTeam
{
typedef QMap<QString, QString> StringMap;
typedef QList<StringMap> StringMapList;
// 定义日志级别
enum LogLevel
{
    llInfo,     // 信息
    llWarning,  // 警告
    llError     // 错误
};
// 定义日志类别
enum LogType
{
    ltUser          = 0x01000000,
...
};
typedef QMap<int, QPair<QString, QString> > LogTypeMap_T;
// 资源类
struct CTDLL_COMMON_API ResourceType
{
    QString desc;
    QMap<QString, QString> privilege;
};
class CTDLL_COMMON_API ShowProgress : public QLabel
{
public:
    ShowProgress(const QString &strInfo);
    ~ShowProgress();
};
class CTDLL_COMMON_API Common
{
public:
    static QNetworkAccessManager *manager;
public:
    static bool isWebLogin();
...
};
}
#endif


在该DLL的.pro文件中加上下面一行:
DEFINES += BUILDING_COMMON_DLL
使用该DLL的其他程序,不用加。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线ccnuliughai
只看该作者 5楼 发表于: 2010-09-01
你好!再次谢谢你对我的解答。
版主应该在win下使用动态库文件的吧?这里我还是有个问题不太明白,在这个你列出的头文件中,第一红色部分倒数第二、三行中的else是什么意思呢?这个不太明白呢。

再有,这样定义的动态库头文件,可以用在linux下直接编译?是不是需要改动改动?
再次谢过啦1
离线dbzhang800

只看该作者 6楼 发表于: 2010-09-01
引用第5楼ccnuliughai于2010-09-01 11:20发表的  :
你好!再次谢谢你对我的解答。
版主应该在win下使用动态库文件的吧?这里我还是有个问题不太明白,在这个你列出的头文件中,第一红色部分倒数第二、三行中的else是什么意思呢?这个不太明白呢。
再有,这样定义的动态库头文件,可以用在linux下直接编译?是不是需要改动改动?
再次谢过啦1
.......

1. 版主给你是一个不需要做任何修改就可在windows、linux等平台下运行的例子
2. 如果对编译预处理命令不熟,建议找本C语言的书看看

题外:
 如果你所谓的windows到linux的移植,是要保证同一套源码在windows和linux下运行,按版主的例子做就行了。
 如果你是要求在linux运行,那就太简单了,这一堆编译预处理命令与宏全部可以省略.
如果你是Qt的动态库,且要跨平台,官方manual给出详细解释。http://doc.qt.nokia.com/4.6/sharedlibrary.html (这个和版主给出的其实是完全一样的,如果你认为不一样,...)

快速回复
限100 字节
 
上一个 下一个