[原创]在linux系统中编写windows程序并连接成二进制文件
发表于 : 2007-12-15 6:58
相信大家对linux的开发环境都很满意,但windows下的应用软件实在是太多了,而且市场决定程序员如果有开发windows软件的经验就更有竞争力,如果你必须在windows环境下开发但又不喜欢windows,现在我有一个办法可以让你在linux下像写linux程序一样写windows程序。
1. 安装wine,为了可以在linux平台上执行windows程序,这个就不说了,源里有,直接装就好了
2. 在windows平台上安装Visual Studio C++ 6.0 (个人比较喜欢6.0,因为小,而且还有MFC)
以下步骤要在linux内操作:
3. 拷贝c:\Program Files\Micro$oft Vi$ual $tudio 文件夹到 $HOME/.wine/drive_c/Program Files/
ok, 现在你有VC了,但你不能用,IDE也不能用,不知道为什么,不过不管了, 反正我并不喜欢VS的IDE。在$HOME/.wine/drive_c/Program Files/Micro$oft Vi$ual $tudio/VC98/Bin 这个文件夹里有一个文件: cl.exe
注意这个文件,它其实是和linux 的gcc 或 g++ 是一样的,是个编译器。虽然找到这个编译器了,但如果我们用它编译程序的话,它会保错,原因是:
在Windows系统中,有三个系统变量:PATH,LIB,INCLUDE, 这三个系统变量对应于 编译器所在文件夹,库文件夹,和头文件夹。
大家都知道windows有个东西叫注册表吧,gnome也有类似的东西,wine是可以直接编辑注册表的,因为它把注册表分为了几个部分,其中CURRENT_USER这个部分被存放在 $HOME/.wine/drive_c/user.reg 中,好了,有办法注册系统变量了。
vim ~/.wine/driver_c/user.reg
然后把下面的内容复制进去,哪里都可以:
[Environment] 1197666624
"Basemake"="C:\\Program Files\\Microsoft Platform SDK\\Include\\BKOffice.Mak\\"
"Bkoffice"="C:\\Program Files\\Microsoft Platform SDK\\"
"INCLUDE"="C:\\Program Files\\Microsoft Platform SDK\\Include\\.;C:\\Program Files\\Microsoft Visual Studio\\VC98\\Atl\\Include;C:\\Program Files\\Microsoft Visual Studio\\VC98\\mfc\\include;C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\"
"INETSDK"="C:\\Program Files\\Microsoft Platform SDK\\"
"LIB"="C:\\Program Files\\Microsoft Platform SDK\\Lib\\.;C:\\Program Files\\Microsoft Visual Studio\\VC98\\mfc\\lib;C:\\Program Files\\Microsoft Visual Studio\\VC98\\lib\\"
"MSDevDir"="C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\"
"MSSdk"="C:\\Program Files\\Microsoft Platform SDK\\"
"Mstools"="C:\\Program Files\\Microsoft Platform SDK\\"
"PATH"="C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools\\WinNT;C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\Bin;C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools;C:\\Program Files\\Microsoft Visual Studio\\VC98\\bin;C:\\Program Files\\Microsoft Platform SDK\\Bin\\.;C:\\Program Files\\Microsoft Platform SDK\\Bin\\WinNT\\Y"
红色的部分比较重要,指明了编译器所在目录已经库文件和头文件
做完上面这些后,你已经可以正常的编译WIN32程序了
但如果想编译MFC程序还需要作些小修改, 因为所有的MFC程序都是默认多线程模式执行的,而当我们用cl编译程序时,默认是单线程的,所以,会给一个错误:
要解决这个错误,只需在cl选项内把默认的线程模型置为多线程
但还是会有一个错误:
这是由于cl编译的程序默认是命令行模式,而MFC程序是窗口模式,只需改变link的参数即可:
(这里解释一下,cl的原理跟gcc相同,是编译和link一起做了)
这就没问题了,程序正常编译,并连接为 test.exe,试一下
这样只是解决了MFC程序的编译,至于ATL和COM库的连接是否会出现问题,还有待发现。下面给一小段MFC程序供测试
4. 最后一步,捷径
写一个script , 让cl用起来像gcc或g++一样
sudo vim /usr/bin/cl
写入
然后 sudo chmod a+x cl
这样,你在编译windows程序时,只需执行
cl test.cpp 就OK了
欢迎补充
1. 安装wine,为了可以在linux平台上执行windows程序,这个就不说了,源里有,直接装就好了
2. 在windows平台上安装Visual Studio C++ 6.0 (个人比较喜欢6.0,因为小,而且还有MFC)
以下步骤要在linux内操作:
3. 拷贝c:\Program Files\Micro$oft Vi$ual $tudio 文件夹到 $HOME/.wine/drive_c/Program Files/
ok, 现在你有VC了,但你不能用,IDE也不能用,不知道为什么,不过不管了, 反正我并不喜欢VS的IDE。在$HOME/.wine/drive_c/Program Files/Micro$oft Vi$ual $tudio/VC98/Bin 这个文件夹里有一个文件: cl.exe
注意这个文件,它其实是和linux 的gcc 或 g++ 是一样的,是个编译器。虽然找到这个编译器了,但如果我们用它编译程序的话,它会保错,原因是:
在Windows系统中,有三个系统变量:PATH,LIB,INCLUDE, 这三个系统变量对应于 编译器所在文件夹,库文件夹,和头文件夹。
大家都知道windows有个东西叫注册表吧,gnome也有类似的东西,wine是可以直接编辑注册表的,因为它把注册表分为了几个部分,其中CURRENT_USER这个部分被存放在 $HOME/.wine/drive_c/user.reg 中,好了,有办法注册系统变量了。
vim ~/.wine/driver_c/user.reg
然后把下面的内容复制进去,哪里都可以:
[Environment] 1197666624
"Basemake"="C:\\Program Files\\Microsoft Platform SDK\\Include\\BKOffice.Mak\\"
"Bkoffice"="C:\\Program Files\\Microsoft Platform SDK\\"
"INCLUDE"="C:\\Program Files\\Microsoft Platform SDK\\Include\\.;C:\\Program Files\\Microsoft Visual Studio\\VC98\\Atl\\Include;C:\\Program Files\\Microsoft Visual Studio\\VC98\\mfc\\include;C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\"
"INETSDK"="C:\\Program Files\\Microsoft Platform SDK\\"
"LIB"="C:\\Program Files\\Microsoft Platform SDK\\Lib\\.;C:\\Program Files\\Microsoft Visual Studio\\VC98\\mfc\\lib;C:\\Program Files\\Microsoft Visual Studio\\VC98\\lib\\"
"MSDevDir"="C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\"
"MSSdk"="C:\\Program Files\\Microsoft Platform SDK\\"
"Mstools"="C:\\Program Files\\Microsoft Platform SDK\\"
"PATH"="C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools\\WinNT;C:\\Program Files\\Microsoft Visual Studio\\Common\\MSDev98\\Bin;C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools;C:\\Program Files\\Microsoft Visual Studio\\VC98\\bin;C:\\Program Files\\Microsoft Platform SDK\\Bin\\.;C:\\Program Files\\Microsoft Platform SDK\\Bin\\WinNT\\Y"
红色的部分比较重要,指明了编译器所在目录已经库文件和头文件
做完上面这些后,你已经可以正常的编译WIN32程序了
代码: 全选
wine cl test.cpp
代码: 全选
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
代码: 全选
wine test.cpp /MT
代码: 全选
libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
(这里解释一下,cl的原理跟gcc相同,是编译和link一起做了)
代码: 全选
wine cl test.cpp /MT /link /subsystem:windows
代码: 全选
wine test.exe
代码: 全选
#include "AFXWIN.H"
class MFC_Tutorial_Window :public CFrameWnd
{
public:
MFC_Tutorial_Window()
{
Create(NULL,"MFC Tutorial Part 1 CoderSource Window");
}
};
class MyApp :public CWinApp
{
MFC_Tutorial_Window *wnd;
public:
BOOL InitInstance()
{
wnd = new MFC_Tutorial_Window();
m_pMainWnd = wnd;
m_pMainWnd->ShowWindow(1);
return 1;
}
};
MyApp theApp;
写一个script , 让cl用起来像gcc或g++一样
sudo vim /usr/bin/cl
写入
代码: 全选
#!/bin/bash
#
file="$*"
#ar="user32.lib gdi32.lib odbc32.lib nafxcw.lib libc.lib LIBCMT.LIB MSVCRT.LIB"
ar="/MT /link /subsystem:windows"
if [ $file!=null ]; then
wine cl $file $ar
else
wine cl
fi
这样,你在编译windows程序时,只需执行
cl test.cpp 就OK了
欢迎补充