Compiling and Linking: Simple Example with Visual C++

The goal of this text is to compare the compilation process between Visual C++ and gcc (see Compiling and Linking: Simple Example with gcc). The process is quite similar but behavior of the tools in Visual Studio is a bit different. The librarian in Visual Studio is link and the compiler is cl.

The sample code is in example.tar.gz or you can browse it here.

1) Unpacking the archive

If you have already unpacked the archive by running the example with gcc, please skip this step.

It is assumed that the archive is already in the current directory.

$ tar zxvf example.tar.gz

The command creates directory example/lib with files testlib.cpp and testlib.h and directory example/app with file main.cpp. The goal is first to compile and make the library and then link the application with the library.

2) Making library

$ cd example/lib
$ cl -EHsc -c testlib.cpp
$ lib -out:testlib.lib testlib.obj

The flag -c forces cl to compile to the object file without linking. Note that the extension of the object file is .obj (not .o as on Unix). The flag -EHsc is necessary to specify the exception model. Without it cl writes a lot of warnings when one uses the C++ Standard Library.

The librarian makes a library from the object files. The extension for the library is .lib (not .a as on Unix).

3) Compiling application

$ cd ../app
$ cl -EHsc -c -I../lib main.cpp

File main.cpp contains a pragma #include that requires cl to find the header testlib.h. In our case, cl does not know where the header is and we must use -I to tell it. The command is very similar to that of gcc. The difference is again in the extension of the object file, .obj and not .o.

4) Linking application with the library

Now we want to convert the object file main.obj to the executable. Along this way, it is necessary to link it with the library testlib.lib. The right command is as follows:

$ cl main.obj testlib.lib -link -LIBPATH:../lib

The library is written along with the object file. The way to specify the location of the library is completely different as compared with gcc. Instead of -L it is -LIBPATH: and additionally it is a part of option for the linker that should be specified by -link.

It is possible not to specify the file name for the binary. By default it is the name of the first object file with the extension .exe. However if one needs to specify it, this should go as a part of the linker options after -link -out:main.exe.

5) Running the binary

$ ./main.exe

Discussion

By default VC++ turns safe iterators on and loose performance:

Numerics: Visual C++ vs. g++
optimization in VC++ Express Edition 2005 Options


Comments are closed.