Eclipse math.h linker error

As you already know the buggy nature of the eclipse ide, there is also a bug on its linker. Actually it is not a bug only in eclipse, because the error is depend on gcc and its inability to solve math library linking after or middle of the code compilation. Let’s explain this phenomenon with an example:

Asssume that we have the following example.c code:

#include <stdio.h>
#include <math.h>
int main(void)
{
        double x = 4.0;
        double result = sqrt(x);
        printf("The square root of %lf is %lf\n", x, result);
        return 0;
}

If we compile this code in bash terminal with:

$ gcc -lm test.c -o test

we have an error as undefined reference to `sqrt‘ (or any other function that called from math.h library) Interestingly if we have a static variable inside the sqrt like ‘sqrt(12.2)’ the compiler don’t give us any error. This happens because when we give the gcc  ‘-lm‘ option, we link the libm.a and libm.so to the compiler. “.a" files are static libraries, as opposed to “.so" files which are dynamic libraries. Normally gcc looks for dynamic libraries if available unless passed -static.  In ”sqrt(12.2)” case gcc is called ‘libm.a’ and not call the function sqrt in the run time, simply assign the value to the static variable.

In bash terminal. if we compile this code with:

$ gcc test.c -o test -lm

problem would be solved for bothe cases. to to this in Eclipse:

  1. Right click on your project in Project Explorer and select Properties.
  2. Go to C\C++ Build -> Settings -> Tool Settings -> Gcc Linker -> Libraries and click on green plus button to add a new library. When the dialog pops up, write m, and Eclipse will automatically add the –Im flag.

Image

source Okumaya devam et

Linux üzerine MATLAB kurma

MATLAB programını kuracağımız dizini oluşturalım:

cd /usr/local

sudo mkdir matlab7

cd matlab7

Öncelikle license.dat dosyasını /usr/local/matlab7 dizinine kopyalıyoruz. Bu dizine bundan sonra $MATLABROOT diyeceğiz. Yazım kolaylığı için:

“MATLABROOT=/usr/local/matlab7” komutuyla “/usr/local/matlab7” yerine $MATLABROOT yazabileceğiz:

MATLABROOT=/usr/local/matlab7

cp /<license.dat_dizini> $MATLABROOT

Artık kurma işlemine geçebiliriz:

sudo /cdrom/install*

sonrasında klasik windows tarzı menülerden OK yes OK yes ile geçiyoruz .you are not license for.. a “no” deyip kurmak istediğimiz programları seçeceğimiz bölüme geliyoruz. Normal olarak cd de yüklü ve lisansımızın kurabileceği tüm programları kurma varsayılan olarak gerçekleştirilir. Kurmak istemediğimiz programları sağ taraftaki “items not to install” kısmına “remove” edebiliriz.

Ardından gelecek menüde create symbolic links to matlab… kısmını yanındaki kutucuğu da işaretleyip “Ok” liyoruz. Begin installation ? Sorusunu evetleyip kuruluma başlıyoruz… 2 ve 3 nolu cd leri istedikçe takıp devam ediyoruz…

Kurulum bitti ancak yapacağımız işler bitmedi. License.lic dosyasında <your server> kısmını server isminizle(shell de @ den sonra gelen kısım: ali@alininbilg) license.lic dosyasını $MATLABROOT/etc klasörüne kopyalıyoruz:

sudo cp /<dosya_yolu>/licence.lic $MATLABROOT/etc

MATLAB programını uygulamalar sekmesinde masaüstünde çalışacak biçimde kısayol oluşturalım.

Bunun için:

/usr/share/applications/ klasörünün altında “matlab.desktop” belgesini oluşturalım ve aşağıdaki kısmı bu dosyaya ekleyelim:

sudo gedit /usr/share/applications/matlab.desktop

açılan sayfaya:

[Desktop Entry]
Name=Matlab
Comment=Matlab
Exec=/usr/local/bin/matlab -desktop
Icon=/usr/local/matlab7/X11/icons/matlab48c_icon.xpm
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true

yazalım ve kaydedelim. Şimdi uygulamalar>programlama altında matlab ikonu görülecek tıklayıp çalıştıralım

Matlab-linux da çok fazla sayıda hata -bug- bulunmakta. Forumlarda ve matlabmathwork sitesinde bu hatalara yapılmaya çalışılan yamaları görebilirsiniz. Bu hatalar sinir bozucu olabiliyor benden söylemesi.

Öncelikli hata sistemimize gnome ve compiz yüklü ise menülerin gri gözükmesi bunun için:

“export AWT_TOOLKIT=MToolkitkomutunu “/usr/local/bin/matlab” dosyasına kaydediyoruz:

sudo gedit /usr/local/bin/matlab

açılan dosyada “#! /bin/sh” nin altına export AWT_TOOLKIT=MToolkit yazıyoruz

matlab ı çalıştırdığımızda(shell e matlab yazıp enter dediğimizde veya oluşturduğumuz kısayola tıklayarak)

matlab command window un en üstünde büyük ihtimalle şu yazılar belirecek:

warning : could not query OpenGL
warning : OpenGL appears to be installed incorrectly

matlab bunun için bir çözüm önerisi sunmuş: http://www.mathworks.com/support/solutions/data/1-18N21.html?solution=1-18N21

matlab da

>>opengl info

komutunu işlettiğimizde hata alıyorsak:

matlab ın uyumlu çalıştığı OpenGL kütüphanelerinde uyumsuzluk problemi bulunmakta.

libGL.so.1.2.x
libGLU.so.1.2.x

veya
libGL.so.1.2.x
libGLU.so.1.3.x

kendi kütüphanemizi sınamak için:

cd /usr/lib

ls openGL*

komutlarını işletiyoruz. Örneğin bendeki sonuç:

libGLcore.so.1 libGLEW.so.1.5 libGL.so.1 libGLU.so.1

libGLcore.so.169.12 libGLEW.so.1.5.0 libGL.so.169.12 libGLU.so.1.3.070002

şimdi iki dosya dikkatimi çekiyor: libGL.so.169.12 . 169.12 takısı OpenGL nin benim nvidia ekran kartı sürücüm tarafından hızlandırıldığını söylüyor (169.12 sürümü ile). Şimdi bu dosyayı vurgulayalım: /usr/lib/libGL.so.169.12

MATLAB ın kurulu olduğu dizinde matlab ın kullanacağı OpenGL dosyası var : $MATLAB/sys/opengl/lib/glnx86/libGLU.so

Bu iki dosyayı seçeceğimiz bir bölümde birbirine bağlayacağız:

sudo mkdir /usr/MATLAB_OpenGL

cd /usr/MATLAB_OpenGL
sudo ln -s /usr/lib/libGL.so.169.12 libGL.so
sudo ln -s $MATLAB/sys/opengl/lib/glnx86/libGLU.so libGLU.so

shell de işlemin onaylandığına dair bir yazı belirecektir:

ln: creating symbolic link `libGL.so’: File exists

şimdi ise export komutu ile /usr/local/bin altındaki matlab dosyasında matlab ın bakacağı dizinlere oluşturduğumuz /usr/MATLAB_OpenGL dizinini de ekleyelim:

sudo gedit /usr/local/bin/matlab

CTRL+F ile “Initialize OpenGL libraries to Mesa” geçtiği yeri bulalım. OpenGL olarak Mesa kullandığımda(matlab bunu öneriyor) sistemim çökmekte-çekirge iki sıçradı- opengl kütüphanelerini mesa yerine oluşturduğumuz dizine yönlendirelim:

LDPATH_OPENGL=’$MATLAB/sys/opengl/lib/$ARCH’

dizinini bulduk burada $ARCH değişkeni X86 mimarisine sahip sistemlerde glnx86

# Determine <final_load_library_path> for each platform

burada platformu belirleyip o ifadenin case nin sonundaki(linux için: ilk case) export LD_LIBRARY_PATH dan önce aşağıdaki komutu giriyoruz:

LD_LIBRARY_PATH=/usr/MATLAB_OpenGL:$LD_LIBRARY_PATH

ve ta ta OpenGL uyarılarından kurtulduk(yani kurtulmuş olmamız gerekir)

sınamak için yeniden matlab ı açıp grafik demolardan birini yürütüyoruz. Ama o da ne tonla yazı ve başında : Segmentation violation detected at the adress … hatası çıkıyor. Yine bir hata yine bir matlab yaması:

önce $MATLAB/bin/glnx86/ altındaki libmwm_ir.so dosyasını yeniden adlandırıyoruz(bir nevi ihtiyatlı silme işlemi)

sudo mv $MATLAB/bin/glnx86/libmwm_ir.so $MATLAB/bin/glnx86/libmwm_ir.so.old

ardından yeni libmwm_ir.so dosyasını indiriyoruz:http://www.mathworks.com/support/solutions/files/s1-OUVOD/libmwm_ir.so

indirdiğimiz dosyanın masaüstünde(~/Masaüstü) olduğunu varsayalım. Bu durumda

sudo cp -f ~/Masaüstü/libmwm_ir.so $MATLAB/bin/glnx86/

komutunu işlettik.Sorun çözüldü gibi(umarım). matlab da:

>>demos

dedik ve bir demo seçtik o da ne şimdi de görüntü yok ?!??!!

neyse önce OpenGL yi doğru yükleyip yüklemediğimize bakalım. Matlab komut satırına:

>>opengl info

yazıyoruz ve şuna bezer bir şeyler çıkması gerekiyor

Version = 2.1.2 NVIDIA 169.12

Vendor = NVIDIA Corporation

Renderer = GeForce 8600M GS/PCI/SSE2

MaxTextureSize = 8192

Visual = 0x27 (TrueColor, depth 24, RGB mask 0xff0000 0xff00 0x00ff)

Extensions = GL_ARB_color_buffer_float GL_ARB_depth…. böyle gider

Hardware Bug Workarounds:

OpenGLBitmapZbufferBug = 0

OpenGLWobbleTesselatorBug = 0

ardından görüntü özelliklerimizi test edelim

>> hf=figure;

>> get(hf,’xvisual’)

ans =

0x24 (TrueColor, depth 24, RGB mask 0xff0000 0xff00 0x00ff)

>> !glxinfo

visual x bf lv rg d st colorbuffer ax dp st accumbuffer ms cav

id dep cl sp sz l ci b ro r g b a bf th cl r g b a ns b eat

———————————————————————-

0x21 24 tc 0 32 0 r y . 8 8 8 0 4 24 8 16 16 16 16 0 0 None

0x22 24 dc 0 32 0 r y . 8 8 8 0 4 24 8 16 16 16 16 0 0 None

0x24 24 tc 0 32 0 r y . 8 8 8 8 4 24 8 16 16 16 16 0 0 None

0x25 24 tc 0 32 0 r . . 8 8 8 0 4 24 8 16 16 16 16 0 0 None

0x26 24 tc 0 32 0 r . . 8 8 8 8 4 24 8 16 16 16 16 0 0 None

0x27 24 tc 0 32 0 r y . 8 8 8 0 4 24 0 16 16 16 16 0 0 None

0x28 24 tc 0 32 0 r y . 8 8 8 8 4 24 0 16 16 16 16 0 0 None

0x29 24 tc 0 32 0 r . . 8 8 8 0 4 24 0 16 16 16 16 0 0 None

0x2a 24 tc 0 32 0 r . . 8 8 8 8 4 24 0 16 16 16 16 0 0 None

0x2b 24 tc 0 32 0 r y . 8 8 8 0 4 0 0 16 16 16 16 0 0 None

0x2c 24 tc 0 32 0 r y . 8 8 8 8 4 0 0 16 16 16 16 0 0 None

.

.görüldüğü üzere 0x2b de derinlik 0 bit ve bu bazı render problemlerine yolaçabileceğinden varsayılan görüntüyü 24 bit derinlikli olan bir alana (örn 0x24) ayarlamalıyız

>> set(0,’defaultfigurexvisual’,’0x24′);

Bu hatalar ile uğraşmak yerine R2008a sürümüne geçmeniz tavsiye olunur ;)

ve 2008a sürümüne geçtim

Başarılı gibi görünen kurulumdan sonra(yukarıda anlatılan, önceki sürümün kurulumuyla aynı) o da ne bir hata ! Ama hayır R14 den epey tecrübe edindik. Hata şöyle diyor:

Warning: Initializing Handle Graphics failed in matlabrc.
This indicates a potentially serious problem in your MATLAB setup, which should be resolved as soon as possible. Error detected was:
MATLAB:badsubscript
Attempted to access monitors(1,:); index out of bounds because size(monitors)=[0,4].

In matlabrc at 108 […]

bahsettiği matlabrc dosyasında hgrc.m adlı mfile dosyasını çağırdığı görülüyor.Dosyayı açalım

>>edit hgrc.m

açılan dosyada

monitors = get(0, ‘MonitorPositions’);

handle ı var. sorun burada.

Doküman bilgilerinden

Monitor:[x y width height;x y width height]

x = primary monitor width + 1
y = primary monitor height + 1

şimdi

bu durumda örneğin benim ekran çözünürlüğüm 1280×800

yapmam gereken değişiklik:

monitors = [0,0,1280,800;1281,801,1280,800];

ve monitors = get(0, ‘MonitorPositions’); kısmı da yorum olarak gizleeyelim nihayi durum:

%monitors = get(0, ‘MonitorPositions’); %edited by tmain

monitors = [0,0,1280,800;1281,801,1280,800];

%monitors = get(0, ‘MonitorPositions’); %onurs tarafından değiştirildi

monitors = [0,0,1280,800;1281,801,1280,800];%monitorume gore ayarlandi

ve matlab ı tekrar başlattık şimdi yine bir hata:

“The desktop configuration was not saved successfully”

Hımm görece basit bir sorun. Dosyaların kaydedileceği yerde matlab yazma izni alamıyor. Bu izinleri de değiştirdiğimizde:(shell)

sudo chmod a+w -R ~/.matlab

Diğer çakışmaların önüne geçmek için dil ayarlarını ingilizceye dönüştürmekte fayda var. bunun için

sudo gedit /usr/local/bin/matlab

ve açılan dosyada ikinci satıra:

export LC_ALL=en_US

yazıyor ve kaydediyoruz.Böylece tüm locale değişkenlerimizi o oturum için amerikan ingilizlerinin tipine çevirdik.

MATLAB ı çalıştırdığımızda ” Locking assertion failure ” hatası alıyorsak(shell ekranında) ve backtrace kısmında java dosyaları listeleniyorsa ayrıca şu komutu da yukarıdaki export ifadesinden sonra eklememiz gerekir:

export MATLAB_JAVA=/usr/lib/jvm/java-6-sun-1.6.0.06/jre

şimdilik düzgün olara çalışan bir matlaba sahibiz gibi görünüyor ;)

Kaffeine “Audio device busy” sorunu

Kaffeine “Audio device busy” sorunu

Film izlemek için MS ortamındaki BSPlayer a Linux alternatifi bulmam gerekti. Xine bu işlerin babası ve bu tabanda yazılmış Kaffeine Player video ve audio codec leri açısından zenginliği ve altyazılar ile sorunsuz çalışmasıyla iyi bir alternatif -belki de daha iyi deneyip göreceğiz-

Ama o da ne görüntü sorunsuz akıp giderken ektanda bir hata mesajı

“Audio device busy”

Kaffeine Player da Settings> xine Engine Parameters>audio sekmesinde driver ı “auto” dan “alsa” ya çekelim. Bu auto algılama kısmında bir sorun var o kesin ;)

Ubuntu Wireless/Kablosuz Ağ Problemi

Ubuntu Wireless/Kablosuz Ağ Problemi

Linux ile ilk tanışanların yüzleştiği önemli problemlerden birisi kablosuz ağlara bağlanmak.

Burada :https://help.ubuntu.com/community/WifiDocs/WirelessTroubleShootingGuide#iwconfig

adım adım çözüm yöntemleri gösterilmiş. Sorun çok farklı nedenlerden kaynaklanabileceği( wireless sürücüsü/wireless devre kesici düğmesinin kapalı olması/yanlış ayarlar/wlan0:avahi vs.) için adımları sırasıyla izlemekte fayda var. Ancak öncelikle:

sudo apt-get update

sudo apt-get install

sudo apt-get upgrade

dizisini uyguluyoruz

Sistem>Yönetim>Ağ üzerine gelip root şifrenizle kilidi açtıktan sonra Kablosuz ağ Essid(görünen isim) girdikten(veya bulduktan) sonra configuration/yapılandırma ayarları otomatik yapılandırma(DHCP) olarak seçip ilk denemmezi yapmakta fayda var. Şayet kablosuz ağa WAP/WEP ile bağlanıyorsak -ki genelde modemler varsayılan olarak A43B28D… gibi şifre verildiği için WEP 16’lı(hexadecimal) şifreleme algoritması kullanılır – modem tarafından üretilen/veya modeme kendimizin atadığı şifrenin girilmesi gerekir. Ancak bazı sürümlerde WAP/WEP şifreleme ile ilgili yazılım sorunları olduğundan çevrede şifresiz bir ağa bağlanabiliyorsak denememizi bu ağdan yapmamız daha mantıklı olacaktır. Böylece varsa sorunu oluşturan nedene yaklaşabiliriz.Ardından shell(uygulamalar>donatılar>uçbirim) açılarak:

#sudo /etc/init.d/networking restart

komutunu vererek ağ konfigürasyonunu yeniden başlatıyoruz.

$iwconfig

komutu ile ağ durumunu görebiliriz. Örneğin bu komutun bendeki çıktısı(değerler değiştirilmiş olarak :) ):

lo        no wireless extensions.
eth0      no wireless extensions.
wmaster0  no wireless extensions.
wlan0     IEEE 802.11g  ESSID:"AirTies"  Nickname:""
Mode:Managed  Frequency:2.462 GHz  Access Point: 00:08:5D:F9:AB:19
Bit Rate=54 Mb/s   Tx-Power=27 dBm
Retry min limit:7   RTS thr:off   Fragment thr=2346 B
Power Management:off
Link Quality=100/100  Signal level=-46 dBm  Noise level=-95 dBm
Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
Tx excessive retries:0  Invalid misc:0   Missed beacon:0

şeklinde bağlantı kalitesi modemin yakınında olduğum için çok iyi ;)

Bağlantıyı sınamak için ayrıca Sistem>Yönetim>Ağ Araçları kısmında Ağ aygıtı wlan0 seçilerek modeme ping atmayı deneyebiliriz(adresi muhtemelen 192.168.1.1 vb. Olacaktır) Ping atmada sorun yaşıyorsanız(ulaşan paket sayısı 0 ise) ilk linkten faydalanarak adım adım çözüm yollarını sınaablirsiniz.

Örneğin benim öncelikle intel wireless 4965AGN kartımın sürücüsünü güncellememe gerekti

$lshw

komutuyla kablosuz ağ kart sürücüsünün doğru yüklenmediğini gördüm:

http://kuscsik.blogspot.com/2007/06/how-to-install-intel-4965-wireless.html

Ardından basit ama beni yaklaşık 1 gün uğraştıran komutu girdim

sudo ip link wlan0:avahi down

wlan0:avahi bağlantısı herşey düzgün gibi gözükmesine karşın şifreli ağa bağlanmamı engelliyordu. Bu komutla sıralamada wlan0:avahi yi wlan0 nın altına alarak bu engeli aşıldı.

Kurulum sonrası kart ilk kez tanındığında sistem kart hafızasını okumak ister ve bu zaman zaman sistemin kilitlenmesine neden olur. Bunu önlemek için:

1) /etc/pcmcia/config.opts Dosyasını açalım

gksudo gedit /etc/pcmcia/config.opts

2) Aşağıdaki bölümü bulalım

  •   include memory 0xc0000-0xfffff
      include memory 0xa0000000-0xa0ffffff
      include memory 0x60000000-0x60ffffff

3) Ve yukarıdaki bölümü tümüyle silip aşağıdaki ile değiştirelim

  •   include memory 0xd0000-0xdffff
      include memory 0xc0000-0xcffff
      include memory 0xc8000-0xcffff
      include memory 0xd8000-0xdffff

Şimdi ise Linux ile süper hızlı internetin keyfini çıkarıyorum ;)

Ps:İnternet bağlantı problemi devam ediyorsa bahsettiğim çıktılarla sorunu yorum olarak yazın yardımcı olmaya çalışırım ;)