cross platform compilation and installers - c++

Assume you just wrote a Qt app. Write once compile everywhere...
you have a windows 7 x86 64 bits machine. You would like to:
Statically compile this executable ( to minimize the numbers of dll/so/frameworks )
Compile it for (x86_64, x86) * (windows[all],linux,mac, and why not bsd) = 6/8 couple (cpu,os)
You also would like people to perform the simplest possible installs:
--> one file for installer which copies an sqlite database in program data and an executable in program files
--> linux via yum/yast/apt-get installs
--> i'm not sure what to do for mac
simple uninstallers
How would you do all this from your windows machine, in particular cross compile for a mac ?
Qt Installer Framework seems to be the right tool for the job. But I can't see how to compiler a mac binary anyway...
What would you use ? Any tool you often use ?
EDIT
following advice I'm looking for a cross compiler. I'll try to integrate it into Qt tool-chain... clang looks great.
http://blog.boceto.fr/2012/04/29/the-universal-compiler/
http://blog.boceto.fr/2012/05/07/the-universal-compiler-part-3-clang-targetting-mingw/
http://clang.llvm.org/docs/CrossCompilation.html

I think the best way to do this is to grab a cross-compiler, and just follow the steps indicated in the Qt Installer Framework for generating the installer executable, once for each platform.

Related

Use GCC on Linux to cross-compile Qt apps for Windows

Ideally, I want to compile our QT-based apps, which also link other third-party libraries, on 64-bit Linux using GCC, but for a 64-bit Windows target. Again ideally, I want the result to run on 64-bit Windows without any additional runtime support, just as if we had compiled the same source code in Visual Studio. Is this possible with MinGW-w64?
I have successfully used MinGW-w64 to compile simple apps with GCC on Windows. I'm not sure how much of the MinGW-w64 installation is runtime support for executables as opposed to support for the GCC compilation environment. I did attempt to run a WinGW-w64 hello world executable on an installation of Windows without MinGW-w64, but had missing dll errors. This tells me that some runtime support was necessary, but I would like to know more precisely what is required.
If you don't want to install Windows, I think the best way is using a Virtual Machine. That's because even if the source code compiles for Windows, how could it be verified to run? You will need a real target environment to finally test your application.
From a complexity point of view, I think setting up a Windows machine (VM or not) and the necessary environment for Qt is a whole lot simpler than cross compiling bug hunting afterwards.
You can install Qt on the installed Windows, copy your project there, compile it and see the results in the real environment. This way you can cope with the minor differences when porting from one OS to another easily.
Nothing stops you from developing on Linux. You can do the entire development on Linux and just test the code on the prepared Windows by compiling and running. Sending the code to the Windows environment is simple by using git. The development process can be like :
Make a repository of your application, clone the repository both on Linux and Windows
Do the Major development on Linux and push
Pull on Windows from time to time, compile, test and make minor fixes and then push

Compile A MSVC++2010 Project So It Can Run On Ubuntu

I have a MSVC++ 2010 project. All the libraries it's using are cross platform (SDL, OpenGL and FLTK).
Obviously, all I have to do right now is press the debug button and it will compile a nice old .exe for me which can now run on Windows, as long as the DLL files are with it.
I had thought before that if you use cross platform libraries, then the generated .exe would run fine on Ubuntu too. I recently found out that this is not possible, and that the program must be compiled in a special way to run on a certain platform.
Is it possible to compile my project in this magical way with MSVC++ 2010 so that it can run on a Ubuntu computer? If so, then could you please answer my question with some clear steps as to what I should do to compile it this way, keeping in mind I'm new to how all this cross platform stuff works?
EDIT:
If I cannot compile a MSVC++ 2010 project for Ubuntu, is there an IDE I could use that could compile the project for both Windows and Ubuntu?
Thanks.
I suggest you use QT. http://qt.digia.com/
It's probably the best cross platform IDE that can let you compile for Windows, Mac and Linux(ubuntu) systems.
Nope, not possible. While the binary code corresponding to the program can be portable, that's not enough. Executable formats on various file systems are different and not compatible. The executable format is essentially a packaging of the binary data and wrapping it with a header that the target file system understands. In order to produce executables for Ubuntu, the linker must support it. MSVC++ doesn't support Linux formats.

Eclipse CDT: From Windows to Linux

I have eclipse installed on windows and use cygwin to develop programs for linux. I compile using the cygwin toolchain and I also do my tests on cygwin.
Now I would like to compile my program also with the native linux toolchain and I also would like to debug it from the windows machine.
Is something possible with Indigo SR2? What is the best way to accomplish this?
I found this but then I would have two projects one for windows and one for linux. I would like to have just one project for both platforms to avoid syncrhonizing the sources back and forth.
Thanks.
I guess you want a cross platform development environment.
There are various tools for the job, but my choice would be CMake. Basically, you will write CMakelists.txt file instead of Eclipse .classpath and .project files, and generate those files with cmake executable. But in details, you will need to overcome some difficulties which are inherent in cross platform development.
I have successfully created more than one project with these tools, and they currently under a heavy load.

Compiling for Mac/Linux on Windows

Obviously you can't really run Mac or Linux apps on Windows, but can you compile binaries for those platforms using MSVC++ for example (plugging in additional compilers and tools obviously)? For a serious build system, you don't want one build server per platform so having an automated build server which compiles for all target platforms seems quite a reasonable aim.
Crosstool-NG seems like your best option for Linux apps; they show that as one of the standard configurations. I do not know about Mac OS X; this question suggests that it will probably be difficult.
I would like to believe (notice my careful words) that GCC can be built to run on windows (any relevant form of the triplet --mingw*) and target another triplet.
A proof-of-concept for the non-believers is provided here, where you can find Win64 hosted compilers that build native linux binaries. I assume the same can be done for mac if the necessary libraries (like the CRT and necessary Mac framework libraries) can be built/used by that compiler.
if you want to build applications using C++, why not use Qt from Nokia. it's cross platform. http://qt.nokia.com/

Building a library across platforms without running all of the platforms

I have a small piece of code that works as a plugin for a larger graphics application. The development platform is Qt with c++ code. I've managed to build a .so, .dylib and .dll for linux, MacOS and Windows respectively, but to do so I had to have a machine running each operating system (in my case, running linux [ubuntu] gcc natively, and windows MinGW and MacOS XCode gcc in virtual machines).
Is there a way to build for all 3 platforms from one? I beat my head against this problem a while back, and research to date suggests that it's not easily (or feasibly) done. The code only needs to link against a single header that defines the plugin
API and is built from a fairly basic Makefile (currently with small variations per platform).
You should have a look at crosscompiling.
You basically build a compiler that (on your current plattform) will output binaries for your desired platforms.
Try this link about doing it on linux, for windows, with QT
Better late than never, I just came across IMCROSS
It looks quite promising!
For Linux it is fairly easy to setup or even download a virtual machine using VMWare for instance. Getting OSX to run on VMWare is somewhat tricky but possible.
Running VMWare and sharing a directory on a local drive you can even compile for the different platforms using the same exact files.
There is somewhere a cross-compiler for OSX but I wouldn't trust it to be of great quality.