GVKun编程网logo

windows程序员开发linux程序的头一个月(结合linux环境简要说明程序员开始编程的5大必要条件)

9

对于想了解windows程序员开发linux程序的头一个月的读者,本文将是一篇不可错过的文章,我们将详细介绍结合linux环境简要说明程序员开始编程的5大必要条件,并且为您提供关于Atratus0.1

对于想了解windows程序员开发linux程序的头一个月的读者,本文将是一篇不可错过的文章,我们将详细介绍结合linux环境简要说明程序员开始编程的5大必要条件,并且为您提供关于Atratus 0.12 发布,Windows上运行Linux程序、Golang在windows下交叉编译linux程序、linux – 如何为Windows应用程序制作一个简单的基于Wine的安装程序、Linux/Windows 应用程序开发的有价值信息。

本文目录一览:

windows程序员开发linux程序的头一个月(结合linux环境简要说明程序员开始编程的5大必要条件)

windows程序员开发linux程序的头一个月(结合linux环境简要说明程序员开始编程的5大必要条件)

  • 开发环境选择
    vim,vscode,qt,visual studio都可以做linux c++开发,但是作为windows程序员,最熟悉的还是visual stuio,加上visual studio 2019 支持cmake及linu开发,所以最终选择了visual studio 2019 + cmake作为开发环境.同时使用虚拟机中的ubuntu作为编译机.

  • 学习cmake基本用法
    学习设置包含路径;
    学习设置库搜索路径;
    学习设置动态库静态库的导入;

  • 选择boost作为基础库
    有许多常用算法的实现,省下不少造轮子的时间.
    可以将很多操作系统相关细节透明化,实现跨平台开发.

  • 学习一个linux发行版基本用法
    选择了最容易入手的ubuntu,有界面操作,也可以使用命令行,还有进程监视器.

  • 选择一个文件传输工具
    FinalShell,不经可以通过ui传输文件,还可以通过ui的方式操作文件.

  • 编码
    算法实现上到是没什么区别,但是一些细节还是需要注意的:

    • 路径格式,windows是正斜杠('/')反斜杠('')都ok,linux必须是正斜杠('/').经常使用boost::filesystem库会减少很多麻烦.
    • windows下wchar_t是2个字节,linux下是三个字节,所以代码不能写的太死,内存分配是经常使用sizeof就可以了.
    • 本机字符windows下是ansi,linux是utf-8,即平时使用的api参数是char*时,windows必须传ansi字符串,而linux必须传入utf-8字符串.
    • 尽量不要使用UINT DWORD这些visual c++的数据类型,旧代码改造留下的如果修改很麻烦,就只能用个头文件typedefine一下这些类型了.
    • linux不支持代码导入库,即不能使用 #pragma comment(lib,"xxx")这种方法通过代码自动导入库,只能通过cmake代码导入.
    • windows的dll搜索路径默认包含当前路径,linux并没有,不会搜索当前路径,可以通过修改LD_LIBRARY_PATH环境变量来添加索索路径.
    • gcc编译器很多时候比msvc的编译器更加严格,相同的代码,windows下编译通过,linux下编译反而报错.
    • linux下一切皆文件,包括socket,进程等,这点和windows的句柄有点不一样.如果需要在进程间传递句柄,则需要使用linux特有的与套接字,这点在windows下反而更方便,一个windows api就可以实现跨进程句柄拷贝了.
    • linux下网络使用epoll,windows使用iocp,不过有boost的asio,直接封装好了.
  • 现状
    一个多月过去了,现在程序已经可以跑在windows和linux上了,visual studio 2019帮了很大的忙,试想如果从vim开始写linux,估计会把人逼疯.而通过vs,一个月,基本上现在常规的开发,问题已经不大了,偶尔遇到问题,也基本可以解决.

Atratus 0.12 发布,Windows上运行Linux程序

Atratus 0.12 发布,Windows上运行Linux程序

Atratus 0.12 支持在 64位 Windows 平台上运行 Debian Wheezy 64 位的应用程序。

Atratus 项目可以让你在 Windows 下运行 Linux 的二进制执行文件。它包含 ELF 二进制加载器、libc 实现和一个系统调用转换器。目前还处于 alpha 前阶段。

Golang在windows下交叉编译linux程序

Golang在windows下交叉编译linux程序

1、下载相关程序。

  Golang下载:http://www.golangtc.com/download

  Git下载:http://git-scm.com/download/

  TDM-GCC下载:http://tdm-gcc.tdragon.net/download

2、Go编译环境配置

  安装 TDM-GCC,程序会自动设置PATH环境变量,如果没有设置成功请手动设置。

  安装Go,安装完后需要设置GOROOT,GOPATH,GOBIN,PATH环境变量,

  其中  

  GOROOT为你的Go安装跟目录

  GOPATH为你go程序开发目录,go get后的包也会下载到该目录。

  GOBIN为你的go运行目录,运行 go install 命令后,程序会被安装到该目录。

  PATH为你Go程序根目录,用于能够通过控制台调用go命令。

3、配置交叉编译环境

  在Go根目录下的src目录,新建一个build.bat文件,并复制内容如下:

set CGO_ENABLED=0set GOROOT_BOOTSTRAP=C:/Go
::x86块
set GOARCH=386set GOOS=windows
call make.bat --no-clean
  
set GOOS=linux
call make.bat --no-clean
  
set GOOS=freebsd
call make.bat --no-clean
  
set GOOS=darwin
call make.bat --no-clean
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  
::x64块
set GOARCH=amd64
set GOOS=linux
call make.bat --no-clean
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  
::arm块
set GOARCH=arm
set GOOS=linux
call make.bat --no-clean
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  
set GOARCH=386set GOOS=windows
go get github.com/nsf/gocode
pause

我的Go程序版本是1.6,需要设置GOROOT_BOOTSTRAP变量为Go的安装目录,否则执行时会报错。

  然后运行build.bat,等待结束。

  该程序会编译其他平台编译Go需要的库和编译文件。

  完成后,在cmd命令行下依次执行:

  set GOOS=linux

  set GOPACH=amd64

  go build -o -x APPNAME main.go

  编译后的文件会出现在main.go相应的目录下。


linux – 如何为Windows应用程序制作一个简单的基于Wine的安装程序

linux – 如何为Windows应用程序制作一个简单的基于Wine的安装程序

我的 Windows应用程序在Wine下运行,但安装对于非专业人员来说有点令人头疼,我在网上看到的包装器(PlayOn Linux,Wine Doors)需要安装更多的软件包.有没有办法制作一个可以安装Wine的软件包,如果用户需要安装它,安装应用程序和快捷方式,所有这些都是最小的用户麻烦?

解决方法

我不相信有任何预先制定的方法可以做到这一点,但你可能很容易制作一个Debian包,这将取决于Wine,将MSI复制到机器上,然后运行Wine的msiexec / i / q作为post-安装脚本

编辑:确保考虑卸载案例!即在预卸载脚本中,也可以再次运行msiexec.

Linux/Windows 应用程序开发

Linux/Windows 应用程序开发

一、基础知识

  虽然写的都是代码,但是代码运行在哪个级别什么位置,还是需要做好定位,这样才心中有数。Linux和Windows都是宏内核,内核自己管理硬件软件资源,对外提供“系统调用”给程序员编程。

  操作系统按照一定的协议把我们写的程序加载进内存,为其分配内存等资源,让其诞生;然后程序自己管自己,自己运行;最后C/C++/Java的mian函数都能会返回,返回后这个程序就结束了(还可能有其他方式,进程被迫结束),所占用的资源(比如内存堆和栈、任务时间片、外设等)返还给了操作系统。

1.1 Linux 环境

    1 Linux系统调用

   所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口获得操作系统内核提供的服务。

   Linux/Unix 的设计策略将是内核空间与用户空间隔绝开,使得内核空间对象或资源“不能”被用户空间直接访问。用户能在用户空间操作用户自己的对象,如果需要使用内核资源,可以直接调用系统调用(system call)或者通过“库(比如C库),也可以叫APIs”间接地调系统调用。系统调用像一个屏障,它将内核空间与用户空间隔开。

  因为核心态和用户态用的是两个不同的栈,切换时需要切换特权级别,并且不同的硬件平台(arm/ibm/intel)有不同的硬件栈指针(StackPointer)实现机制,所以系统调用的实现需要用到汇编语言,实现的功能包括切换SP、参数传递、上下文切换等。如果提到汇编怎么通过cpu寄存器传递参数,这些细节都有其标准,不必深究。如果提及StackPointer,stm32就有两个独立的StackPointer(SP),MSP与PSP。需要指出Linux用户空间、内核空间与中断是有区别的:用户空间和内核空间其实看上去就是运行在不同处理器特权级别上的普通程序(相对中断而言),只不过内核空间运行着整个软件系统的核心LinuxKernel,里面装的是正在运行的Linux Objects;中断程序一般针对硬件,短小而严谨,不能睡眠。

  Linux系统调用非常精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。

   2 系统库/通用库

  这里系统库指Linux/Unix之上的通用库,比如C/C++库。

  编程人员可以通过调用C/C++库继而调用Linux/Unix的系统调用。当然,这些库不仅仅涉及到操作系统(也就是系统调用),还涉及到与系统资源无关的比如数值计算等库函数,而这种类型的库函数可以在用户空间执行。

   3 系统命令

       Shell 实际上也是一个可执行程序,与其他普通程序并无二致,它是通过命令行方式运行其它程序的程序。

   4 系统内核、系统调用、通用库、shell、应用程序之间的关系

  见下图。

 

1.2 Windows 环境

  Windows和Linux类似都有一套系统内核对象(或者叫组件、模块,比如进程、内存、文件系统等)。Windows提供了 Windows APIs -> Microsoft Fundation(MFC) -> [todo]

MFC 是利用面向对象思想的C++语言对 WindowsAPIs 进行的一次封装。MFC提高了编程的效率,但是降低了灵活度。MFC还有一个莫名其妙的别名,叫 Visual C++,是指“用 Visual Studio IDE 、C++ 和 MFC 技术”开发 windows 程序的意思,侧重在“MFC”。这句话出自《深入浅出MFC》第二版侯俊杰。终于知道多年的VC++是什么意思了。这个世界太乱了,乱起名,让人厌恶、不负责任。

《深入浅出MFC》(第二版)侯俊杰

Winconsole程序是没有GUI的WinAPIs程序。

 1.3 C/C++/Java 标准库函数

  我认为不管是基于操作系统还是基于裸机,你只要编写出符合标准库函数规范的函数即可, 即标准对于如何实现无要求,因此不同的实现方式,可能性能上有所差异。

  以malloc为例,malloc invokes either brk or mmap syscall to obtain memory.

https://www.linuxjournal.com/article/6390

https://sploitfun.wordpress.com/2015/02/11/syscalls-used-by-malloc/amp/

关于malloc in linux 的说明:

When a process needs memory, some room is created by moving the upper bound of the heap forward, using the brk() or sbrk() system calls. Because a system call is expensive in terms of CPU usage, a better strategy is to call brk() to grab a large chunk of memory and then split it as needed to get smaller chunks. This is exactly what malloc() does. It aggregates a lot of smaller malloc() requests into fewer large brk() calls. Doing so yields a significant performance improvement. The malloc() call itself is much less expensive than brk(), because it is a library call, not a system call. Symmetric behavior is adopted when memory is freed by the process. Memory blocks are not immediately returned to the system, which would require a new brk() call with a negative argument. Instead, the C library aggregates them until a sufficiently large, contiguous chunk can be freed at once.

For very large requests, malloc() uses the mmap() system call to find addressable memory space. This process helps reduce the negative effects of memory fragmentation when large blocks of memory are freed but locked by smaller, more recently allocated blocks lying between them and the end of the allocated space. In this case, in fact, had the block been allocated with brk(), it would have remained unusable by the system even if the process freed it.

我们今天的关于windows程序员开发linux程序的头一个月结合linux环境简要说明程序员开始编程的5大必要条件的分享就到这里,谢谢您的阅读,如果想了解更多关于Atratus 0.12 发布,Windows上运行Linux程序、Golang在windows下交叉编译linux程序、linux – 如何为Windows应用程序制作一个简单的基于Wine的安装程序、Linux/Windows 应用程序开发的相关信息,可以在本站进行搜索。

本文标签: