質問するログイン新規登録

回答編集履歴

1

2018/10/03 02:48

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -4,13 +4,23 @@
4
4
 
5
5
  ```
6
6
  |-- CMakeLists.txt
7
- |-- lib
7
+ |-- lib1
8
8
  | |-- hello.c
9
9
  | `-- hello.h
10
+ |-- lib2
11
+ | |-- hoge.c
12
+ | `-- hoge.h
10
13
  `-- src
11
14
  `-- sample.c
15
+
12
16
  ```
13
17
 
18
+ ## リンク関係
19
+
20
+ ```
21
+ sample (実行バイナリ) --参照--> libhoge.so (共有ライブラリ) --参照--> libhello.so (共有ライブラリ)
22
+ ```
23
+
14
24
  ## CMakeLists.txt
15
25
 
16
26
  ```
@@ -18,30 +28,35 @@
18
28
 
19
29
  project(sample)
20
30
 
31
+ # ライブラリのヘッダーがあるディレクトリを include ディレクトリに追加する。
32
+ include_directories(lib1 lib2)
33
+
21
- # 共有ライブラリ
34
+ # 共有ライブラリ1
22
35
  ############################################################
23
36
 
37
+ # 共有ライブラリを作成する。
24
- set(LIBRARY_NAME "hello")
38
+ add_library(hello SHARED lib1/hello.c)
25
39
 
40
+ # 共有ライブラリ2
41
+ ############################################################
42
+
26
43
  # 共有ライブラリを作成する。
27
- add_library(${LIBRARY_NAME} SHARED lib/hello.c)
44
+ add_library(hoge SHARED lib2/hoge.c)
45
+ target_link_libraries(hoge hello) # libhello.so をリンク
28
46
 
29
47
  # 利用する側
30
48
  ############################################################
31
49
 
32
- # ライブラリのヘッダーがあるディレクトリを include ディレクトリに追加する。
33
- include_directories(lib)
34
-
35
50
  # 実行バイナリを作成する。
36
51
  add_executable(${PROJECT_NAME} src/sample.c)
37
52
 
38
53
  # ライブラリをリンクする。
39
- target_link_libraries(${PROJECT_NAME} hello)
54
+ target_link_libraries(${PROJECT_NAME} hoge) # libhoge.so をリンク
40
55
  ```
41
56
 
42
- ## lib/
57
+ ## lib1/
43
58
 
44
- ライブラリのコード
59
+ ライブラリ1のコード
45
60
 
46
61
  hello.h
47
62
  ```
@@ -64,17 +79,41 @@
64
79
  }
65
80
  ```
66
81
 
82
+ ## lib2/
83
+
84
+ ライブラリ1を利用するライブラリ2のコード
85
+
86
+ hoge.h
87
+ ```
88
+ #ifndef HOGE_H
89
+ #define HOGE_H
90
+
91
+ void hoge();
92
+
93
+ #endif // HOGE_H
94
+ ```
95
+
96
+ hoge.c
97
+ ```
98
+ #include "hello.h"
99
+
100
+ void hoge()
101
+ {
102
+ print_hello();
103
+ }
104
+ ```
105
+
67
106
  ## src/
68
107
 
69
- ライブラリ利用側のコード
108
+ ライブラリ2を利用するバイナリ
70
109
 
71
110
  sample.c
72
111
  ```
73
- #include "hello.h"
112
+ #include "hoge.h"
74
113
 
75
114
  int main()
76
115
  {
77
- print_hello();
116
+ hoge();
78
117
  }
79
118
  ```
80
119
 
@@ -92,4 +131,76 @@
92
131
  ```
93
132
  $ ./sample
94
133
  Hello
134
+ ```
135
+
136
+ ## 追記
137
+
138
+ ### ライブラリの作成
139
+
140
+ ```
141
+ add_library(hello SHARED hello.c)
142
+ ```
143
+
144
+ ビルドすると、libhello.so という共有ライブラリが作成されます。
145
+
146
+ ### 実行ファイルの作成
147
+
148
+ ```
149
+ add_executable(sample sample.c)
150
+ ```
151
+
152
+ ビルドすると、`sample` という実行バイナリが作成されます。
153
+
154
+ ### 共有ライブラリのリンク
155
+
156
+ ```
157
+ target_link_libraries(sample hello)
158
+ ```
159
+
160
+ 実行バイナリ `sample` に libhello.so をリンクします。
161
+
162
+ ### ライブラリの検索パス追加
163
+
164
+ ライブラリの検索パスに ./lib を追加
165
+
166
+ ```
167
+ link_directories(lib)
168
+ ```
169
+
170
+
171
+ ### インクルードディレクトリの検索パスに ./include を追加
172
+
173
+ ```
174
+ include_directories(include )
175
+ ```
176
+
177
+ ## 質問の CMakeLists.txt について
178
+
179
+ CMakeLists.txt がいろいろおかしいです。
180
+
181
+ ```
182
+ cmake_minimum_required(VERSION 3.5)
183
+ project(testProject)
184
+
185
+ # ${PROJECT_NAME} は project() で設定した名前で自動的に作られるため、不要
186
+ set(PROJECT_NAME testProject)
187
+
188
+ # 両方あるのは、おかしい
189
+ # 共有ライブラリなら add_library()
190
+ # 実行バイナリなら add_executable()
191
+ # あと libget.so のようにリンクする共有ライブラリはここに書く必要はない
192
+ add_executable(Main main.c)
193
+ add_library(my SHARED main.c libget.so)
194
+
195
+
196
+ find_library(LIBPATH
197
+ NAMES libget.so
198
+ HINTS /home/to2836/Desktop/workbench/test3
199
+ REQUIRED)
200
+
201
+ # target_link_libraries は add_executable() または add_library() の
202
+ # あとでなければならない
203
+ # 以下の記述は Main に libget.so をリンクしています。
204
+ # libmy.so が liget.so をリンクする記述が CMakeLists.txt にありません。
205
+ target_link_libraries(Main ${LIBPATH})
95
206
  ```