質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • C++

    3117questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • CMake

    59questions

    CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

-Lオプションをパス付けるとライブラリのリンクができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 276

Himatya1

score 3

現在、ProjucerとCLionを使って開発しています。

Projucerとは、ソースファイルを様々な環境でビルドできるようにIDE用のプロジェクトファイルを生成してくれるツールです。
また、必要なライブラリを指定すると、プロジェクトファイルにも設定されるようになります。
ProjucerでCLion用にプロジェクトファイルを生成すると、CMakeLists.txtが自動生成されます。

問題

自作のスタティックライブラリをリンクしようとしたのですが、上手くいきませんでした。

CMakeLists.txt中身をみると、target_link_libraries(proj PRIVATE -L[追加したライブラリ...])といった形式でライブラリが追加されていました。

そこで、ライブラリを使っている部分だけを切り出し、別プロジェクトで試したところ、
絶対パスを指定した場合のみリンクができました。

#/lib/lib.aをリンクしたい(/libの中身はlib.aのみ)
#これはリンクできる
target_link_libraries(proj PRIVATE "/lib/lib.a")
#ディレクトリパスだとリンクができない
target_link_libraries(proj PRIVATE "-L/lib")

スタティックライブラリのCMakeは以下の通りです。

cmake_minimum_required(VERSION 3.9)
project(libproj)
set(CMAKE_CXX_STANDARD 14)
add_library(libproj STATIC lib.cpp)

質問

Projucerで何度も設定を変更する可能性があるため、変更を適用するたびに自動生成されるCMakeLists.txtを手動で編集することは避けたいです。

そこで、target_link_librariesを使って-Lオプションを指定するという条件を満たした上で、ライブラリをリンクするにはどうすればよいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/12/15 09:26

    "-L/lib"だと、どのライブラリをリンクするか判らないですよね。 ディレクトリごとというのは、そのディレクトリに存在するライブラリを全部リンクするという乱暴な事をしたいという事ですか?(乱暴というのは、機能が重複するライブラリやそのプロジェクトでは使わないライブラリをリンクする危険を冒すという意味で使いました)

    キャンセル

  • Himatya1

    2017/12/15 11:46

    はい。"-L"を使用する背景について追記しました。

    キャンセル

回答 1

checkベストアンサー

0

こんにちは。

CMakeのtarget_link_librariesA link flagを見ると、-で始まるitemはリンカ用のフラグとして取り扱うようですね。
CLionを使ったことはないのですが、これは gcc に対応しているようですね。

さて、gccの-Lオプションは指定したライブラリを探すフォルダを指定します。
そして、実際にリンクするライブラリを-lオプションで指定します。
この後者の指定がないとリンクされません。

やったことはないですが、特定のフォルダ配下のライブラリを全てリンクしたい場合は、CMakeのfileコマンドの GLOB  を使えばリンクするライブラリのリストを生成できますので、それをtarget_link_librariesに渡すことで可能とは思います。

これを Projucer 経由でできるのか?は分かりませんが、CMakeのfind_packageコマンドを呼ばせることが可能なら、恐らくできると思います。(findコマンド用のCMakeスクリプトを作って、その中でfileでリストするイメージです。多くのfind_packageコマンド用のCMakeスクリプトは何らかの方法でリンクするライブラリのリストを出力していますし。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3117questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • CMake

    59questions

    CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。