質問: webcam # make all all:clean $(TARGETS) # compile webcam: webcam.cpp $(CC) $(CFLAGS) -o webcam webcam.cpp $(INCLUDE) $(LDFLAGS) -lopencv_core -lopencv_videoio -lopencv_highgui -lm # make clean clean: rm -f *.o *~ $(TARGETS) ``` そうすると、 > > ❯ make ✘ 2 > > rm -f *.o *~ webcam > > g++ `pkg-config opencv --cflags` `pkg-config opencv --libs` -I/usr/local/include -o webcam webcam.cpp -L/usr/local/lib -lopencv_core -lopencv_videoio -lopencv_highgui -lm > > /tmp/cc8VH7I3.o: 関数 `main' 内: > webcam.cpp:(.text+0x38):`cv::VideoCapture::VideoCapture(int)' に対する定義されていない参照です > > webcam.cpp:(.text+0xf1): `cv::imshow(cv::String const&, cv::_InputArray const&)' に対する定義されていない参照です > webcam.cpp:(.text+0x194):`cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector > const&)' に対する定義されていない参照です > > /tmp/cc8VH7I3.o: 関数 `cv::String::String(char const*)' 内: > webcam.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x54):`cv::String::allocate(unsigned long)' に対する定義されていない参照です > > /tmp/cc8VH7I3.o: 関数 `cv::String::~String()' 内: > webcam.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14):`cv::String::deallocate()' に対する定義されていない参照です > > /tmp/cc8VH7I3.o: 関数 `cv::String::operator=(cv::String const&)' 内: > webcam.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28):`cv::String::deallocate()' に対する定義されていない参照です > > collect2: error: ld returned 1 exit status > > makefile:13: recipe for target 'webcam' failed > > make: *** [webcam] Error 1 > > > のようなリンカーエラー?が表示されます。 解決方法を一通り調べましたが、いずれの方法を試しても「〜に対する定義されていない参照です」か、極稀に「シンボル〜への未定義参照です」のようなエラーを吐きます。 C++やOpenCVを触るのは初めてです。 よろしくお願いいたします。
回答: ここが違います ``` $(CC) $(CFLAGS) -o webcam webcam.cpp $(INCLUDE) $(LDFLAGS) -lopencv_core -lopencv_videoio -lopencv_highgui -lm ``` gcc (g++) では、リンクするライブラリ(変数 $(CFLAGS) に展開されている)はソースファイル `webcam.cpp` より後に書かなければいけません。 これでどうでしょうか? ``` $(CC) -o webcam webcam.cpp $(CFLAGS) (以下略) ```