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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CMake

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

9269閲覧

Linuxで外部ライブラリをリンクさせる方法

to2836

総合スコア16

CMake

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/10/02 05:40

前提・実現したいこと

現在Linux上で外部ライブラリのリンクの仕方について勉強しているのですが。
まずやりたいことは外部ライブラリlibget.so(整数100の値をreturnするget関数が作られているget.cファイルを動的ライブラリとして生成)をmain.cファイル(main関数は何もせず上にset関数が定義されておりその中ではget関数がコールされる)とリンクさせて1つの動的ライブラリ(libmy.so)を生成させたいです。
外部ライブラリlibget.soは生成したのですが、これをCMakeLists.txt上にどのように書けばmain.cファイルをリンクして1つの動的ライブラリを生成できるのかが分りません。

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.5) PROJECT(testProject) SET(PROJECT_NAME testProject) SET(CMAKE_VERBOSE_MAKEFILE true) SET(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc") ADD_EXECUTABLE(Main main.c) find_library(LIBPATH NAMES libget.so HINTS /home/to2836/Desktop/workbench/test3 REQUIRED) target_link_libraries(Main ${LIBPATH}) ADD_LIBRARY(my SHARED main.c libget.so)

main.c

#include<stdio.h> int get(); int set(){ int num; num=get(); return num; } int main(){ return 0; }

ここでcmakeをしたらlibmy.soが生成されます。

nmを使ってlibmy.soに入っている関数確認

to2836@to2836:~/Desktop/workbench/test3/build$ nm libmy.so 000003e0 t $a 0000039c t $a 0000054c t $a 000003a4 t $a 00000550 t $a 00000404 t $a 00000448 t $a 00000498 t $a 00000500 t $a 00000504 t $a 000003a8 t $a 000003bc t $a 00011030 B __bss_end__ 00011030 B _bss_end__ 0001102c B __bss_start 0001102c B __bss_start__ 000003e0 t call_weak_fn 0001102c b completed.9928 w __cxa_finalize 000003fc t $d 00000438 t $d 00000488 t $d 00011028 d $d 000004ec t $d 00010f34 t $d 00010f30 t $d 0001102c b $d 00000554 r $d 000003b8 t $d 00000404 t deregister_tm_clones 00000498 t __do_global_dtors_aux 00010f34 t __do_global_dtors_aux_fini_array_entry 00011028 d __dso_handle 00010f38 a _DYNAMIC 0001102c D _edata 00011030 B _end 00011030 B __end__ 0000054c T _fini 00000500 t frame_dummy 00010f30 t __frame_dummy_init_array_entry 00000554 r __FRAME_END__ U get 00011000 a _GLOBAL_OFFSET_TABLE_ w __gmon_start__ 0000039c T _init w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable 00000530 T main 00000448 t register_tm_clones 00000504 T set 0001102c d __TMC_END__

set関数は入っているのですがget関数はU(未定義シンボル)として表示されます…

U get … … … 00000504 T set

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下の手順で共有ライブラリのリンクを確認できました。

フォルダ構造

|-- CMakeLists.txt |-- lib1 | |-- hello.c | `-- hello.h |-- lib2 | |-- hoge.c | `-- hoge.h `-- src `-- sample.c

リンク関係

sample (実行バイナリ) --参照--> libhoge.so (共有ライブラリ) --参照--> libhello.so (共有ライブラリ)

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0) project(sample) # ライブラリのヘッダーがあるディレクトリを include ディレクトリに追加する。 include_directories(lib1 lib2) # 共有ライブラリ1 ############################################################ # 共有ライブラリを作成する。 add_library(hello SHARED lib1/hello.c) # 共有ライブラリ2 ############################################################ # 共有ライブラリを作成する。 add_library(hoge SHARED lib2/hoge.c) target_link_libraries(hoge hello) # libhello.so をリンク # 利用する側 ############################################################ # 実行バイナリを作成する。 add_executable(${PROJECT_NAME} src/sample.c) # ライブラリをリンクする。 target_link_libraries(${PROJECT_NAME} hoge) # libhoge.so をリンク

lib1/

ライブラリ1のコード

hello.h

#ifndef HELLO_H #define HELLO_H void print_hello(); #endif // HELLO_H

hello.c

#include <stdio.h> void print_hello() { printf("Hello\n"); }

lib2/

ライブラリ1を利用するライブラリ2のコード

hoge.h

#ifndef HOGE_H #define HOGE_H void hoge(); #endif // HOGE_H

hoge.c

#include "hello.h" void hoge() { print_hello(); }

src/

ライブラリ2を利用するバイナリ

sample.c

#include "hoge.h" int main() { hoge(); }

ビルドコマンド

mkdri build cd build cmake .. make

テスト

$ ./sample Hello

追記

ライブラリの作成

add_library(hello SHARED hello.c)

ビルドすると、libhello.so という共有ライブラリが作成されます。

実行ファイルの作成

add_executable(sample sample.c)

ビルドすると、sample という実行バイナリが作成されます。

共有ライブラリのリンク

target_link_libraries(sample hello)

実行バイナリ sample に libhello.so をリンクします。

ライブラリの検索パス追加

ライブラリの検索パスに ./lib を追加

link_directories(lib)

インクルードディレクトリの検索パスに ./include を追加

include_directories(include )

質問の CMakeLists.txt について

CMakeLists.txt がいろいろおかしいです。

cmake_minimum_required(VERSION 3.5) project(testProject) # ${PROJECT_NAME} は project() で設定した名前で自動的に作られるため、不要 set(PROJECT_NAME testProject) # 両方あるのは、おかしい # 共有ライブラリなら add_library() # 実行バイナリなら add_executable() # あと libget.so のようにリンクする共有ライブラリはここに書く必要はない add_executable(Main main.c) add_library(my SHARED main.c libget.so) find_library(LIBPATH NAMES libget.so HINTS /home/to2836/Desktop/workbench/test3 REQUIRED) # target_link_libraries は add_executable() または add_library() の # あとでなければならない # 以下の記述は Main に libget.so をリンクしています。 # libmy.so が liget.so をリンクする記述が CMakeLists.txt にありません。 target_link_libraries(Main ${LIBPATH})

投稿2018/10/02 15:13

編集2018/10/03 02:48
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

to2836

2018/10/03 02:13

ご回答ありがとうございます。 しかしlibmy.soにあたるライブラリの生成部分はどこにあるのでしょうか? 外部ライブラリ(libget.so)と生成させるライブラリ(libmy.so)をリンクさせる形にしたいのですが… 最終目標がAndroid用にbuildされたOpenAL-Softのライブラリ(外部ライブラリ)を利用してUnityのScript(C#)でOpenALの関数を呼び出したいのですがそのまま呼び出すことが出来ません。なのでOpenAL-Softのライブラリ(外部ライブラリ、現在のlibget.soに該当)をリンクさせたOpenALの関数を呼び出すCコードを作成し、それに対した一つのライブラリ(現在のlibmy.soに該当)を生成しUnityにPluginさせOpeALのコードを実行させる関数一つを呼びだす形にしたいのですが。
tiitoi

2018/10/03 02:27

libget.so を利用する libmy.so を作成して、libmy.so を別の実行バイナリで利用するということでしょうか?
to2836

2018/10/03 02:34

はいそうです^^
tiitoi

2018/10/03 02:50

質問のサンプルコードを sample (実行バイナリ) --参照--> libhoge.so (共有ライブラリ) --参照--> libhello.so (共有ライブラリ) としました。 質問欄に記載の CMakeLists.txt がおかしいので、サンプルを参考に直してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問