amazon

28.2.11

Makefileでmakeするときに、g++でコンパイルしたのにccになってしまう現象



Cで作っていたプログラムをC++に変えてみたところ、
Makefileでmakeするときに、g++でコンパイルしたのにccになってしまった。

結論から言うと、main.c -> main.cpp に変えたのは良いのだが、
main.cを残しておくとエラーを起こすようだ。

今回の経過は次のとおりである。

main.cでインクルードしていたfunc.hでcppの関数を使いたかったので、
main.cとfunc.cをmain.cppにfunc.cppに変えた。
main.cとmain.cppは同じ内容である。
func.hにはをインクルードした。

こんなMakefileを作ってmakeしてみた。
# Makefile

# ターゲット(プログラム)名とオブジェクトファイル名
target = a.exe
srcs = main.cpp
objs = $(srcs:%.cpp=%.o)

# 定義済みマクロの再定義
CXX = g++
CXXFLAGS = -g -Wall

# サフィックスルールの適応対象の拡張子の定義
.SUFFIXES: .cpp .o

# プライマリターゲット
$(target): $(objs)
$(CXX) -o $@ $^

# サフィックスルール
.cpp.o:
$(CXX) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
$(RM) $(target) $(objs)

すると、次のエラー。

$ make
cc -c -o main.o main.c
In file included from main.c:3:
func.h:7:20: error: iostream: No such file or directory
make: *** [main.o] Error 1

念のためターミナルに直接コマンドを打つとエラーは起きない。

$ g++ -o a.exe main.cpp
$

エラーをよく見てみると、
コンパイラを$(CXX)に指定しているのに、ccでコンパイルしている。
ちなみに、CXXの中身はg++である。
さらに、よく見てみると!?main.oの後がmain.cになっている。

makeでコンパイルされたのは、main.cppではなく、main.cを自動的にccでコンパイルしていることが分かった。
main.cを削除してmakeしたら無事成功した。

24.2.11

MacPortsでlftpを再インストール on Mac OSX Snow Leopard


lftpは、リモートサーバをターミナルと同じようにcdやlsやmkdirやtab補完まで使えて、非常に便利。

Snow Leopardでlftp使おうと思ったら、関連しているダイナミックライブラリのarchitectureが違うと怒られた。
インストール済みのlftpは、Macbookでコンパイルしたものだから32bitでコンパイルされていて使えないのは当然。
というか、これまでのOpenCVに関する問題もそれが原因。

そこで、macportsで、
$ sudo port install ltp
と打つと、今度はportが32bitだからダメだって怒られた。

結局、ここを参考にして、portsから再インストールして、無事lftpが使えるようになった。

16.2.11

Snow Leopardで32bitビルドの仕方


Snow LeopardにOpenCVをインストールしたはいいが、
コンパイル時にアーキテクチャを指定しないと以下のエラーが出た。
$ g++ -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
ld: warning: in obj/main.o, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcxcore.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcv.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcvaux.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libml.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libhighgui.dylib, file was built for i386 which is not the architecture being linked (x86_64)
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

obj/main.oや*.dylibのファイルは、x86_64にリンクされていてi386でビルドされいないと言われる。
Snow Leopardのデフォルトのコンパイラが64bitでx86_64であるからのようだ。
32bitまたはアーキテクチャをi386に指定して上げればよいだろう。

$ g++ -m32 -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
または、
$ g++ -arch i386 -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
これでコンパイルできるはず。

参考:
http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20100505
http://www-utheal.phys.s.u-tokyo.ac.jp/~yuasa/wiki/index.php/MacOSX_Snow_Leopardでld:_symbol(s)_not_foundが出てしまう

13.2.11

Snow LeopardにOpenCV 2.2をインストールした時のエラー対処


Snow Leopard Mac OS X 10.6.6に、OpenCV 2.2をインストールしてみた。

ここここを参考にして、
http://opencv.jp/downloadから、ダウンロードしてきて、
CMakeを使って、makeファイルを作って、ターミナルで
$ make
と打ってみたが、以下のエラーが出た。
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [lib/libopencv_highgui.2.2.0.dylib] Error 1
make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
make: *** [all] Error 2

ググったらここが出てきた。
revisionのr3277がSnow LeopardとUbuntuで問題のようだ。
それなら、最新版をインストールすればよい。
$ svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk opencv
とし、
CMakeでCMAKE_OSX_ARCHITECTURESをi386に指定して再度makeファイルを作った。
architecturesをi386に指定するのはopencv2.2が32bitに対応していて64bitには対応していないからだ。Snow Leopardのデフォルトではコンパイラがx86_64なので64bitでビルドされてしまう。
$ make
今度は先程のエラーがでなくなった。
$ sudo make install
無事インストール出来た。

4.2.11

Parallels 6 for MacのファイルをターミナルからみたときのPATH

Macのターミナルから、Parallels上のファイルにアクセスした。

$ cd /private/tmp/1045/C/
でCドライブにアクセスできる。

tmpとあるし、1045なので、この番号は変わるかも。

$ find / -name Windows
これで調べただけ。

/Volumes/とかにあるかと思ったけど違うんだね。