views:

317

answers:

9

Hello there,

I used to program in Windows with Microsoft Visual C++ and I need to make some of my portable programs (written in portable C++) to be cross-platform, or at least I can release a working version of my program for both Linux and Windows.

I am total newcomer in Linux application development (and rarely use the OS itself).

So, today, I installed Ubuntu 10.04 LTS (through Wubi) and equipped Code::Blocks with the g++ compiler as my main weapon. Then I compiled my very first Hello World linux program, and I confused about the output program.

I can run my program through the "Build and Run" menu option in Code::Blocks, but when I tried to launch the compiled application externally through a File Browser (in /media/MyNTFSPartition/MyProject/bin/Release; yes, I saved it in my NTFS partition), the program didn't show up.

Why? I ran out of idea.

I need to change my Windows and Microsoft Visual Studio mindset to Linux and Code::Blocks mindset.

So I came up with these questions:

  1. How can I execute my compiled linux programs externally (outside IDE)?
    • In Windows, I simply run the generated executable (.exe) file
  2. How can I distribute my linux application?
    • In Windows, I simply distribute the executable files with the corresponding DLL files (if any)
  3. What is the equivalent of LIBs (static library) and DLLs (dynamic library) in linux and how to use them?
    • In Windows/Visual Studio, I simply add the required libraries to the Additional Dependencies in the Project Settings, and my program will automatically link with the required static library(-ies)/DLLs.
  4. Is it possible to use the "binary form" of a C++ library (if provided) so that I wouldn't need to recompile the entire library source code?
    • In Windows, yes. Sometimes precompiled *.lib files are provided.
  5. If I want to create a wxWidgets application in Linux, which package should I pick for Ubuntu? wxGTK or wxX11? Can I run wxGTK program under X11?
    • In Windows, I use wxMSW, Of course.
  6. If question no. 4 is answered possible, are precompiled wxX11/wxGTK library exists out there? Haven't tried deep google search.
    • In Windows, there is a project called "wxPack" (http://wxpack.sourceforge.net/) that saves a lot of my time.

Sorry for asking many questions, but I am really confused on these linux development fundamentals.

Any kind of help would be appreciated =)

Thanks.

+3  A: 
  1. Navigate to the folder with your compiled program and execute ./program
  2. Send the program, plus any .so files
  3. .a is static library, .so is shared libraries.
  4. Yes, but often you need to compile it yourself first.

Not sure about wxWidgets distributions, though.

rlbond
A: 

1, Unix generally doesn't have a particular extension for an executable - so myprog.exe would just be myprog. You might have to set it to be executable if the IDE doesn't do this automatically, type "chmod +x myprog"

5, For wxWindows I would download the source and build it, check the build instructions but it's probably just a matter of "configure;make;make install". Generally in Unix you build libs form source so that they can correctly find all the components on your machine - you also have the source of examples etc.

Martin Beckett
A: 

I just added some information to rlbond's answer.

  1. It is depens on Linux version. If you use a Ubuntu - create a deb-package. (http://ubuntuforums.org/showthread.php?t=51003)

Can I run wxGTK program under X11?

Yes, if you have wxGTK package installed :)

demas
A: 

Why not just stick with what you know and develop in .NET? Ubuntu comes native with Mono. You could keep using Visual C++ or step up to C# and make your life a whole lot easier.

typoknig
A: 

This is not really going to answer your questions, but I think is a valid recommendation.
You have two issues you are trying to deal with:

  1. The Linux environment.
  2. Making sure your program is portable.

If I were you I would load CodeBlocks on Windows and run against either Cygwin or Mingw, that will help you make sure your code is portable across platforms. You are familiar with the environment and would gain maximum productivity getting over the OS hurdle.

Once you are satisfied with the above then take your code and move it to Linux. At that point any porting effort should be trivial.

Romain Hippeau
+2  A: 

Since Ubuntu comes with wxGTK packages you should definitely build against them. For development you should use a debug version though, so it might be good to build yourself, but for deployment building against the packages the system provides seems better.

wxX11 is a worse choice than wxGTK, use it only for systems where wxGTK doesn't exist or requires newer GTK libraries than are available.

mghie
On Ubuntu, the library packages needed for developing against a library generally end with `-dev`. Eg - `libwxgtk2.8-dev` for wxGTK 2.8. You don't even need to compile yourself to have a debug version - the debugging symbols for the distribution libraries are packaged up too (eg. `libwxgtk2.8-dbg`).
caf
+1  A: 

A piece of general advice to Linux newcomers, but who are technically minded to begin with, is: You should learn to use your chosen distribution properly.

In your case, that means learning how to acquire the right development packages provided by Ubuntu. For instance, some other people are advising you to download the source for libraries you are going to use, but the better way is to use Ubuntu's package system to download the libraries you want to program against, together with the headers for that library (often put in a separate package) as well as the debug symbols for the library (also often in a separate package).

Look in the System->Administration menu in Ubuntu for the Synaptic tool, which allows you to search the package repositories on the Internet. You'll almost certainly find packages for the libraries you need, as well as all tools.

harms
+10  A: 

How can I execute my compiled linux programs externally (outside IDE)? In Windows, I simply run the generated executable (.exe) file

On Linux you do the same. The only difference is that on Linux the current directory is by default not in PATH, so typically you do:

./myapp

If you add current dir to the path

PATH=".:$PATH"

then windows-like way

myapp

will do, but this is not recommended due to security risks, at least in shared environments (you don't want to run /tmp/ls left by somebody).

How can I distribute my linux application? In Windows, I simply distribute the executable files with the corresponding DLL files (if any)

If you are serious about distributing, you should probably learn about .deb (Ubuntu, Debian) and .rpm (RedHat, CentOS, SUSE). Those are "packages" which make it easy for the user to install the application using distribution-specific way.

There are also a few installer projects which work similarly to windows installer generators, but I recommend studying the former path first.

What is the equivalent of LIBs (static library) and DLLs (dynamic library) in linux and how to use them?

.a (static) and .so (dynamic). You use them in more or less the same way as on Windows, of course using gcc-specific compilation options. I don't use Code::Blocks so I don't know how their dialogs look like, in the end it is about adding -llibrary to the linking options (guess what: on windows it is about adding /llibrary ;-))

Is it possible to use the "binary form" of a C++ library (if provided) so that I wouldn't need to recompile the entire library source code?

Yes. And plenty of libraries are already present in distributions.

Note also that if you use .deb's and .rpm's for distribution, you can say "my app needs such and such libraries installed" and they will be installed from the distribution archives. And this is recommended way, in general you should NOT distribute your copy of the libraries.

If I want to create a wxWidgets application in Linux, which package should I pick for Ubuntu? wxGTK or wxX11? Can I run wxGTK program under X11?

Try wxGTK first, dialogs may look better, gnome themes should be used etc.

If question no. 4 is answered possible, are precompiled wxX11/wxGTK library exists out there? Haven't tried deep google search.

Try

apt-cache search wx

(or spawn your Ubuntu Software Center and search for wx)

In short: you will find everything you need in distribution archives.

Mekk
I'd +1 you twice if I could, for the point about using the dependency information in packages for libraries, instead of bundling.
harms
@harms - Fixed that for you.
Tim Post
I strongly caution you against adding the current directory to PATH. While it's only a really really bad security problem if it's done as root [cringe], it can certainly end up dangerous enough just for a single user, or at least lead to some pretty odd unexpected behavior. This is especially true if you prepend it as you suggest; it's pretty rare to want to override something already installed, and you probably want to append it (`PATH="$PATH:."`) if you really really want it there.
Jefromi
A: 

When you say your program didn't show up I assume you mean that it was there in the file browser but when you double clicked it you got a busy cursor for a moment and then nothing happened?

If so then it means that the program failed to run, probably because it couldn't find the dynamic libraries it's linked against. To diagnose the problem you can run it from a terminal and then you'll be told what the problem is.

You might want to read the manual page for ld.so i.e. type

man ld.so

into a terminal. This tells you where the Linux dynamic library linker looks for libraries at run-time. It also refers you to another useful tool called ldd which I recommend becoming familiar with if your are doing Linux development.

Troubadour