Ubuntu その6 「undefined reference to `__ctype_b'」 | 乖離のぶろぐ(*´∀`)吸い込んで応援
(゚ω゚)Binary Distributionsを使ってみたら・・・
http://xerces.apache.org/xerces-c/download.cgi
xerces-c-3.1.1-x86_64-linux-gcc-3.4.tar.gz

(゚ω゚)こんなエラーが出た。
g++ -o dist/Debug/GNU-Linux-x86/xerces_test build/Debug/GNU-Linux-x86/main.o -Wl,-rpath,../xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib ../xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib/libxerces-c.a
../xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib/libxerces-c.a(XMLString.o): In function `xercesc_3_1::XMLString::trim(char*)':
XMLString.cpp:(.text+0xb46): undefined reference to `__ctype_b'

(゚ω゚)libxerces-c.aは__ctype_bを呼び出しているが、見つかりません。ということ。
(゚ω゚)調べているうちに、
(゚ω゚)システムに似合ったライブラリをソースから作らなければならない。
(゚ω゚)という事に気づいた。


http://xerces.apache.org/xerces-c/build-3.html
./configure --disable-static CC=gcc-4.3 CXX=g++-4.3 CFLAGS=-O3 CXXFLAGS=-O3

(゚ω゚)libxerces-c.aを作り直したい(makeしたい)為、--disable-static は不要らしい。
(゚ω゚)手順は以下のとおり。


# インストールされたgccのバージョンを調べる。
ls -la /usr/bin/gcc*
lrwxrwxrwx 1 root root 7 3月 14 2012 /usr/bin/gcc -> gcc-4.6
-rwxr-xr-x 1 root root 353216 4月 16 2012 /usr/bin/gcc-4.6

cd xerces-c-3.1.1
./configure CC=gcc-4.6 CXX=g++-4.6 CFLAGS=-O3 CXXFLAGS=-O3
# 実行すると config.logの最終行に configure: exit 0 が入り、最後まで実行されっぽい。

# configureと同一ディレクトリでmakeする。
make clean
make
# 続いて、 make install をすると、
# /usr/local/include/xercesc/utilや、
# /usr/local/lib/libxerces-c.a が配置される。
# make install をしなくても、コピー元であるインクルードやライブラリは
# xerces-c-3.1.1の中に作られており、探せば見つかる。


(゚ω゚)これはmake installしない場合のNetBeans IDE のビルドメッセージ
(゚ω゚)xerces-c-3.1.1/src/.libs/libxerces-c.aがmakeされたライブラリ。


"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
make[1]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' に入ります
rm -f -r build/Debug
rm -f dist/Debug/GNU-Linux-x86/xerces_test
make[1]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' から出ます


消去 SUCCESSFUL (合計時間: 251ms)

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' に入ります
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/xerces_test
make[2]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' に入ります
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
g++ -c -g -I../xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++ -o dist/Debug/GNU-Linux-x86/xerces_test build/Debug/GNU-Linux-x86/main.o -lpthread ../xerces-c-3.1.1/src/.libs/libxerces-c.a
make[2]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' から出ます
make[1]: ディレクトリ `/home/pochifx/public/NetBeansProjects/Xerces_Test' から出ます


ビルド SUCCESSFUL (合計時間: 1s)

(゚ω゚)続いて、make installした場合のNetBeans IDE のビルドメッセージ。

(゚ω゚)予め、/etc/ld.so.conf に、.soファイルの path を書き、
(゚ω゚) ldconfigを実行する必要がある。

root@ubuntu64:/etc# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/usr/local/lib

root@ubuntu64:/etc#
root@ubuntu64:/etc#/sbin/ldconfig
root@ubuntu64:/etc#


(゚ω゚)参考URL http://linuxcom.info/linux-cmd-ldconfig.html
(゚ω゚)リンカーのライブラリに -lxerces-c というオプションが必要。


"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
make[1]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' に入ります
rm -f -r build/Debug
rm -f dist/Debug/GNU-Linux-x86/cppapplication_1
make[1]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' から出ます


消去 SUCCESSFUL (合計時間: 251ms)

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' に入ります
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/cppapplication_1
make[2]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' に入ります
mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
g++ -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp
mkdir -p dist/Debug/GNU-Linux-x86
g++ -o dist/Debug/GNU-Linux-x86/cppapplication_1 build/Debug/GNU-Linux-x86/main.o -lxerces-c
make[2]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' から出ます
make[1]: ディレクトリ `/home/pochifx/public/Netbeans/CppApplication_1' から出ます


ビルド SUCCESSFUL (合計時間: 851ms)