• ベストアンサー

gccでわざわざ-lmのようにライブラリを指定しなきゃいけない理由は?

質問は題名の通りです。 例えばmath.hに  #pragma comment(lib, "libm.a") のように元々書いてあれば 自分で指定せずに済むのではないでしょうか? (gccがpragmaをサポートしているかは知りませんが。。。) なぜなのでしょうか。 教えてくださいm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

ソースを書く人とコンパイルする人は同じとは限らないし、数学ライブラリが libm.aだと限ったわけでもないから、ソースにライブラリのファイル名を書くのはダメ。 ってことでしょう。

kirikirkaz
質問者

お礼

ヘッダに対応するライブラリの名前は決まってなかったんですね・・・なるほど・・・

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

複数のライブラリをリンクするときリンクの順番とかも影響するのでそのときは困りますね。

kirikirkaz
質問者

お礼

なるほど、そういえばgccではリンクの順番が影響を受けるんですね。 まだよくわかってないのですが。。。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4855/10270)
回答No.2

歴史的経緯でしょうね。原初のCコンパイラからの継続性というか。 ライブラリはMakefileで指定するものという使い方が定着した後では、ヘッダでライブラリを指定されては混乱します。 あとは、libmではありませんが、同じヘッダファイルで、何種類かのライブラリを差し替えて使うようなケースがあったと思うのですが、ちょっと思い出せません。

kirikirkaz
質問者

お礼

なるほど、確かに混乱しますね。 > あとは、libmではありませんが... そんな場合もあるのですね。知りませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

リンカが理解してくれないから無意味です.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [C++]VC2008のC++がECLIPSE(GCC)で使えない

    VC2008EXPRESSは重いのでECLIPSE(コンパイラはGCC)に乗り換えました。しかしVC2008で作成したプログラムが動きません。 具体的には以下のライブラリを使用しているプログラムなのですがECLIPSEでは認識できないようでエラーになります。 #pragma comment(lib,"ws2_32.lib") このDLLはECLIPSEでは使えないのでしょうか?

  • gccでの共有ライブラリのver指定

    表題の件に関して質問させていただきます。 たとえば/usr/libにある;libA.soをリンクしたい時、gccでは gcc -lA としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか? サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。 また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。 解決法をご存知の方、ご教授お願い致します。

  • VS2013のC++のlibの指定

    VS2013のC++のlibの指定に関した質問です。 下記のコードの代わりに、プロジェクトのリンカーオプション(一覧表の中の項目)で 指定できますか? #pragma comment( lib, "Release\\MathFuncsDll.lib" ) 以上、宜しくお願いします。

  • #pragma commentの相対パス指定

    #pragma commentの相対パス指定について、希望の動作をしないません。 状況は以下の通りです。 libというフォルダの中にlibA、libBの二つのフォルダがあり、それぞれのフォルダの中には、lib_a.lib、mylib_b.libというファイルがあるとします。 lib -libA -lib_a.lib -libB -lib_b.lib またライブラリディレクトリにはlibのパスのみが指定されていたとします。 この状況で#pragma comment(lib,"libA\\lib_a.lib")とすると、 「LINK : fatal error LNK1104: ファイル 'libA\lib_a.lib' を開くことができません。」 と出てしまいます。 #pragma commentの中では、相対パスは使えるはずなのですが、なぜこの場合はリンクが出来ないのでしょうか? ちなみに絶対パスで指定した場合はエラーは出ません。 できればフォルダで分割してライブラリを管理したいと考えているので、何か解決方法をご存知の方がいれば、ご教授ください。 環境は ・OS:Windows7 ・使用ソフト:Visual C++ 2010 Express ・言語:C++ です。

  • 'stdafx.h'のエラーに関して

    http://tetlist.info/2011/01/17/fftw-%E3%82%92-visual-studio-2010-%E7%92%B0%E5%A2%83%E4%B8%8B%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B 上記のサイトにある下記のプログラムを実行した場合、fatal error C1083: include ファイルを開けません。'stdafx.h': No such file or directory というエラーが出ました。 間違いがわからずに困っています。もし解決方法がわかる方がいましたら教えていただけないでしょうか?よろしくおねがいいたします。 #include "stdafx.h" #include #pragma comment(lib, "libfftw3-3.lib") #pragma comment(lib, "libfftw3f-3.lib") #pragma comment(lib, "libfftw3l-3.lib") #define _USE_MATH_DEFINES #include int main(int argc, char* argv[]) { const int kSamples = 16; fftw_complex *in = reinterpret_cast(fftw_malloc(sizeof(fftw_complex) * kSamples)); fftw_complex *out = reinterpret_cast(fftw_malloc(sizeof(fftw_complex) * kSamples)); for (int t = 0; t < kSamples; t++ ) { in[t][0] = sin(2.0 * M_PI * static_cast(t) / kSamples); in[t][1] = 0; } fftw_plan p = fftw_plan_dft_1d(kSamples, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); for (int t = 0; t < kSamples; t++ ) { printf("%02d\t%+5.2f%+5.2fi\n", t, out[t][0], out[t][1]); } return 0; } また、(5)で下記の記述があるので、上記の.cppファイルがある場所に下記のファイルを作製したのですが間違いでしょうか?詳しい方がいましたら教えていただけないでしょうか? よろしくお願いいたします。 (5) 実際に使用するに ライブラリを実際に使用するにあたっては stdafx.h に #include <fftw3.h> stdafx.cpp に #pragma comment(lib, “libfftw3-3.lib”) #pragma comment(lib, “libfftw3f-3.lib”) #pragma comment(lib, “libfftw3l-3.lib”) を追記すると良いはずです。

  • 実行結果をフォルダに格納

     aviファイルの動画を1フレームずつの画像に分けていくプログラムを作りました。  hogehoge%05d.jpgで画像ファイルを生成していくようにしているのですが、この実行結果から得られた画像を、すべてフォルダに格納するように改良したいのです。どうしたらいいでしょうか?  プログラムは以下です。 ------------------------------- /* 警告warningを出なくする */ #pragma warning(disable : 4996) #pragma warning(disable : 4244) /* リンクするOpenCVライブラリ指定 */ #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"cv.lib") #pragma comment(lib,"highgui.lib") //#pragma comment(lib,"ipl.lib") #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* filename="result1.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 int fileCount; char fileName[256]; //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(fileCount = 1;;fileCount++){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //画像保存 sprintf(fileName,"hogehoge%05d.jpg",fileCount); cvSaveImage(fileName, src); // //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); return 0; } ---------------------------------

  • opencvで画像上に丸を描画の方法

    opencv初心者です。 visualstudio2012 C++でopencvを動かすことはできているのですが、目的としてフルスクリーンに表示した画像の上に2点を丸でいいので表示したいのですが、画像しか表示されない、もしくは画像とは別のウィンドウで丸が表示される状態になっています。 // OpenCV2.4Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと #include "opencv2\opencv.hpp" #include <opencv2/core/core.hpp> #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video243d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video243.lib") #endif //int _tmain(int argc, _TCHAR* argv[]) int gazouhyouzi(){ //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\fruits.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ std::exit(0); } //処理後画像データの確保 // IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) // cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //表示ウィンドウの作成 cvNamedWindow("src",0); //srcというwindowをフルスクリーンに設定 cvSetWindowProperty("src",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN); //画像の表示 cvShowImage ("src", src_img); //キー入力待ち cvWaitKey (0); cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3); // 画像,円の中心座標,半径,色,線太さ,種類 cv::circle(img, cv::Point(100, 100), 20, cv::Scalar(200,0,0), -1, CV_AA); //画像データの解放 cvReleaseImage(&src_img); //全てのウィンドウの削除 cvDestroyAllWindows(); return 0; } とても見づらいとは思いますが間違っている部分の訂正をお願いしたく、投稿しました。 初心者なもので言葉の表現が間違っているかも知れませんが、よろしくおねがいします。 ちなみに上記のプログラムで実行すると、画像だけがフルスクリーンに表示されるだけです。

  • Visual C++,OpenCVでのリンクエラー

    こんにちは。 現在、Microsoft Visual C++ 2010 の環境で、OpenCV(ver2.3.1)を用いて、画像認識のアプリケーションを作ろうと考えています。ただ、Visual C++ 、OpenCV共に扱うのが初めてで、openCVのライブラリーをC++に認識させることができていません。 具体的には、下記の様なエラーが出ます。 「 Sample.obj : error LNK2019: 未解決の外部シンボル _cvReleaseImage が関数 _wmain で参照されました。 (同様に、以下の外部シンボルも参照できていません。_cvDestroyAllWindows、_cvWaitKey、_cvShowImage、_cvSmooth、_cvCreateImage、_cvGetSize、_cvNamedWindow、_cvLoadImage) 」 リンクの設定が上手くできていないと考え、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 全般 > 追加ライブラリディレクトリ に、C:\opencv\build\x64\vc10\lib というように記入し(64bit環境です)、また、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 入力 > 追加依存ファイル に、opencv_core231d.lib;opencv_imgproc231d.lib;opencv_highgui231d.lib;opencv_objdetect231d.lib;opencv_contrib231d.lib;opencv_features2d231d.lib;opencv_flann231d.lib;opencv_gpu231d.lib;opencv_haartraining_engined.lib;opencv_legacy231d.lib;opencv_ts231d.lib;opencv_video231d.lib を追加しております。 実行しているサンプルファイルは下記になります。 -------------------- // Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // 『C:\OpenCV2.3\include』を追加のこと #include "opencv2\\opencv.hpp" #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231.lib") #endif int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //表示ウィンドウの作成 cvNamedWindow("src"); cvNamedWindow("dst"); //処理後画像データの確保 IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //画像の表示 cvShowImage ("src", src_img); cvShowImage ("dst", dst_img); //キー入力待ち cvWaitKey (0); //全てのウィンドウの削除 cvDestroyAllWindows(); //画像データの解放 cvReleaseImage(&src_img); cvReleaseImage(&dst_img); return 0; } --------------- 初心者な質問で大変恐縮ながら、どこを修正すればよいかお分かりでしたら、お教え頂けませんでしょうか?何卒宜しくお願いします。

  • h8300-linux-elf-gccで指定可能な配列の大きさ

    AKI-H8/3069Fを使ってプログラムのC言語による組込ソフトの勉強をしています。そこで、教えていただきたいのですが、配列の大きさの上限値はいくつなのでしょうか? 例えば、unsigned int char a[1025];としてもコンパイル時にエラーが出なければ大丈夫なのでしょうか? 参考にしているのは、書籍『はじめる組込みLinux』です。そして、そのサポートサイトからダウンロードしたGCCコンパイラ(h8300-linux-elf-gcc)を使用しています。

  • dllが見つからない

    PhysXLoader.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。 とアプリケーションを起動するとエラーが出ます コンパイル時はdllをきちんと指定され読み込まれているのですが、 どうすれば改善されるでしょうか? プログラムでは #pragma comment(lib,"PhysXLoader.lib") と指定しています