poniedziałek, 10 marca 2014

Tworzenie biblioteki dynamicznej - Linux

Chciałbym dzisiaj pokazać jak stworzyć oraz podlinkować stworzoną przez siebie bibliotekę dynamiczną.

Na początek coś na temat statycznej biblioteki (static library) - teoria.
Jest to rodzaj biblioteki, która łączona jest z programem wykonywalnym dopiero w momencie jego wykonania. Aby tego dokonać, system operacyjny komputera musi posiadać pewne funkcje, które umożliwiają łączenie dynamiczne.

Rozważmy pewien prosty przykład. Będziemy mieli łącznie trzy pliki. Dwa z prawie takimi samymi funkcjami oraz jeden plik z main-em programu.

Pierwszy plik - funkcja1.cpp
void funkcja1(int &p_arg1)
{
  p_arg1 = 55;
}
Drugi plik - funkcja2.cpp
void funkcja2(int &p_arg1)
{
  p_arg1 = 77;
}
Main programu - main.cpp
#include 

using namespace std;

void funkcja1(int &p_arg1);
void funkcja2(int &p_arg1);

int main()
{
  int l_liczba = 10;
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja1(l_liczba); 
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja2(l_liczba);
  cout << "l_liczba = " << l_liczba << endl;

  return 0;
}
Gdybyśmy chcieli by zadziałał powyższy przykład należałoby skompilować wszystkie pliki:
g++ main.cpp funkcja1.cpp funkcja2.cpp -Wall -o main
Stwórzmy teraz bibliotekę dynamiczną.

1. Kompilacja programów funkcja1.cpp oraz funkcja2.cpp.
g++ -Wall -fPIC -c funkcja1.cpp funkcja2.cpp
Flaga -Wall wyświetli wszystkie warningi podczas kompilacji. Utworzyły nam się pliki funkcja1.o oraz funkcja2.o.

2. Utworzenie biblioteki.
g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
3.
ln -sf libctest.so.1.0 libctest.so.1
4.
ln -sf libctest.so.1.0 libctest.so
5. Kompilacja programu main.
g++ -Wall -L. main.cpp -lctest -o prog
6. Odpalenie.
LD_LIBRARY_PATH=. ./prog

Tworzenie biblioteki statycznej - Linux

Chciałbym dzisiaj pokazać jak stworzyć oraz podlinkować stworzoną przez siebie bibliotekę statyczna.

Na początek coś na temat statycznej biblioteki (static library) - teoria.
Jest to biblioteka funkcji i podprogramów, która łączona jest z programem w momencie konsolidacji. W przypadku narzędzi dostarczonych przez Microsoft dla systemów z rodziny Windows pliki bibliotek mają zazwyczaj rozszerzenia .lib lub .obj, natomiast dla pakietów w systemach z rodziny Unix (np. GCC) i ich portach dla systemu Microsoftu (jakim jest np. MinGW) są to .a lub .o.

Rozważmy na początek pewien prosty przykład. Będziemy mieli łącznie trzy pliki. Dwa z prawie takimi samymi funkcjami oraz jeden plik z main-em programu.

Pierwszy plik - funkcja1.cpp
void funkcja1(int &p_arg1)
{
  p_arg1 = 55;
}
Drugi plik - funkcja2.cpp
void funkcja2(int &p_arg1)
{
  p_arg1 = 77;
}
Main programu - main.cpp
#include 

using namespace std;

void funkcja1(int &p_arg1);
void funkcja2(int &p_arg1);

int main()
{
  int l_liczba = 10;
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja1(l_liczba); 
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja2(l_liczba);
  cout << "l_liczba = " << l_liczba << endl;

  return 0;
}
Gdybyśmy chcieli by zadziałał powyższy przykład należałoby skompilować wszystkie pliki:
g++ main.cpp funkcja1.cpp funkcja2.cpp  -Wall -o main
Stwórzmy teraz bibliotekę statyczną.

1. Skompilujmy pliki funkcja1.cpp oraz funkcja2.cpp.
g++ -Wall -c funkcja1.cpp funkcja2.cpp
Flaga -Wall wyświetli wszystkie warningi podczas kompilacji. Utworzyły nam się pliki funkcja1.o oraz funkcja2.o.

2. Czas stworzyć bibliotekę wydając komendę:
ar -cvq bibliotekaTestowa.a funkcja1.o funkcja2.o
Dzięki temu zabiegowi utworzył nam się plik/biblioteka:
bibliotekaTestowa.a
3. Można wyświetlić całą zawartość nowo utworzonej biblioteki za pomocą komendy :
ar -t bibliotekaTestowa.a
4. Na sam koniec pozostało przetestować naszą bibliotekę:
g++ -o [plik wykonywalny] main.cpp bibliotekaTestowa.a

g++ -o main main.cpp bibliotekaTestowa.a
Istnieje jeszcze druga możliwość. Jeżeli biblioteka znajduje się w innym katalogu to wystarczy:
g++ -o [plik wykonywalny] main.cpp [sciezka do katalogu]/bibliotekaTestowa.a

g++ -o main main.cpp yy/bibliotekaTestowa.a

Na zakończenie:-)

Nota historyczna:
Kiedyś po utworzeniu biblioteki było konieczne, aby uruchomić polecenie: ranlib ctest.a. Ten stworzył tabelę symboli w archiwum. Ranlib jest teraz wbudowany w polecenie "ar".

Uwaga dla programistów MS / Windows: "." Linux / Unix biblioteka jest koncepcyjnie taka sama jak w Visual Studio C++ statyczne biblioteki "lib".

niedziela, 9 marca 2014

Instalacja Roota na linuxie.


Co to jest Root?

Jest to framework wspomagający pisanie programów do analizy danych. Powstał w 1994 roku w laboratorium CERN na potrzeby analizy danych fizyki wysokich energii i jest od tego czasu stale rozwijany.

Coś więcej na temat samego frameworka:

http://root.cern.ch/drupal/

Tematem posta jest instalacja roota. Chciałbym podzielić się wiedzą jak zainstalować narzędzie root na Ubuntu.
Niestety nie wystarczy wpisać sudo apt-get install root.

Instalacja Root-a krok po kroku:

Tutaj są informacje jak można to zrobić. Jednak nie jest wszystko zbyt jasno opisane.
http://root.cern.ch/drupal/content/installing-root-source

Link do stronki gdzie możemy ściągnąć framework.
http://root.cern.ch/drupal/content/downloading-root
Ja osobiście ściągnąłem wersje:
Old, version 5.32/04
ponieważ najnowsza (recommended) nie działała:-(
Najnowsza nie działająca:
Pro, version 5.34/17

Po ściagnięciu rozpakowuje komendą (tak jak jest na stronce napisane) lub graficznie. Wchodzę do folderu, gdzie ściągnąłem framework i wpisuje komendę:
gzip -dc root_<version>.source.tar.gz | tar -xf -
czyli przykładowo:
gzip -dc root_v5.32.04.Linux-slc5-gcc4.3.tar.gz | tar -xf -
lub prawym rozpakuj tutaj:-).
Później trzeba skopiować rozpakowanego roota do /usr/local za pomocą komendy:
sudo mv root /usr/local
Potem dodać do ".bashrc" linijki:
// w home otwarcie pliku
sudo nano .bashrc
Dodanie odpowiednich flag:
export ROOTSYS=/usr/local/root
export PATH=$ROOTSYS/bin:$PATH
export LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
Na sam koniec :
source ~/.bashrc
Inne przydatne linki:
https://particle.phys.uvic.ca/~keeler/teaching/phys521a/Tools/rootInstall.html

niedziela, 2 marca 2014

Instalacja i uruchomienie pierwszego testu z Google Test Framework (GTest) na Linuxie (Ubuntu)

Google Test jest to framework służący do pisania testów jednostkowych w C++. W tym poście wyjaśnię w jaki sposób zainstalować oraz uruchomić Google Test na Linuxie (Ubuntu).

1. Pierwszym krokiem jest instalacja gtest development package:
sudo apt-get install libgtest-dev
2. Należy pamiętać, że ten pakiet instaluje pliki źródłowe. Kod musisz skompilować samemu, tzn. stworzyć niezbędne pliki biblioteki. Pliki źródłowe powinny być umieszczone w katalogu /usr/src/gtest. Przejdź do tego folderu i używając cmake skompiluj bibliotekę:
sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

# copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
sudo cp *.a /usr/lib
3.Teraz wypadałoby przetestować jakiś prosty kod:
//codeToTest.cpp
#include 
 
double add(const double a, const double b) 
{
    return a + b;
}
4. W poniższym kodzie, tworzymy dwa testy, które umożliwiają testowanie funkcji za pomocą prostego makra "assertion". Istnieje wiele innych makr w tym framework-u (patrz http://code.google.com/p/googletest/wiki/Primer#Assertions). Kod zawiera główną funkcję, która automatycznie uruchomia wszystkie testy. Prosto i szybko.
// tests.cpp
#include "codeToTest.cpp"
#include 

TEST(addTest, positiveInput) 
{ 
    ASSERT_EQ(3., add(1., 2.));
    ASSERT_EQ(35., add(10., 25.));
}

TEST(addTest, nagetiveInput) 
{
    ASSERT_EQ(1., add(-1., 2.));
    ASSERT_EQ(-1., add(1., -2.));
}
 
int main(int argc, char **argv) 
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
5. Następnym krokiem jest kompilacja kodu. Należy stworzyć mały plik CMakeLists.txt, żeby skompilować testy. Plik ten lokalizuje bibliotekę testową Google Test i łączy go z aplikacją testową. Należy pamiętać również o tym, żeby zlinkować biblioteke pthread.
cmake_minimum_required(VERSION 2.6)

# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# Link runTests with what we want to test and the GTest and pthread library
add_executable(runTests tests.cpp)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
6. Skompiluj i uruchom testy:
cmake CMakeLists.txt
make
./runTests
Powodzenia w testowaniu kodu.

Bibliografia:

https://code.google.com/p/googletest/wiki/Documentation

sobota, 1 marca 2014

Kolorowanie składni kodu - syntax highlighter & blogger

Jakiś czas temu zacząłem używać Blogger-a, jako serwisu blogowego. Jestem pod wrażeniem w jak łatwy sposób można tworzyć posty oraz modyfikować istniejące, edytować layout itp. Jedna rzecz, która jest dość ważna w szczególności dla programistów, chcących wklejać swoje kawałki kodu, jest taka, że Blogger nie posiada na chwilę obecną narzędzia do wklejania kodu, który ładnie by się wyświetlał. W tym poście chciałbym opisać, jak w łatwy, szybki i ładny sposób wyświetlać kody w postach na bloggerze (kolorować składnie kodu). W tym celu potrzeba będzie wykorzystać SyntaxHighlighter Javascript Library.

Następujące rzeczy należy wykonać:

1. Skopiuj poniższy kod:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


2. Wejdź do zakładki "Szablon":


3. Następnie kliknij w przycisk "Edytuj plik HTML":



4. Tuż przed znacznikiem </head> wklej skopiowany wyżej kod.
5. Zapisz szablon.
6. Następnie można rozpocząć tworzenie, bądź edytowanie starych postów z ładnie podświetlanym kodem. Należy wejść do sekcji "Posty". Następnie już w konkretnym formatowaniu danego posta należy przejść do sekcji "HTML"



7. W momencie, gdy chcemy wkleić jakiś kod należy przed, jak i po nowo wstawianym kodzie wstawić odpowiedni znacznik dla C++ będzie <pre class="brush: cpp"> jakiś kod w C++ </pre>, natomiast dla np. csharp <pre class="brush: csharp"> jakiđ kod w csharpie </pre>


int main(int argc, char **argv)
{
std::cout << "Hello world!" << std::endl;
return 0;
}


Efekt pokazy został poniżej:

int main(int argc, char **argv)
{
std::cout << "Hello world!" << std::endl;
return 0;
}

Istnieje kilka rzeczy na, które należy zwrócić uwagę:

- Java script używa <code> Tag. Tak więc wiele szablonów posiada styl dla tego tagu. Może więc zaistnieć sytuacja, żeby będziesz musiał usunąć styl, że kod ładnie się formatował.

- Czasem klikając w podgląd kod wyświetli się nie sformatowany. Jednak, gdy później damy "Opublikuj" wszystko powinno być ok.