回答編集履歴

1

2018/10/03 02:48

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -10,16 +10,36 @@
10
10
 
11
11
  |-- CMakeLists.txt
12
12
 
13
- |-- lib
13
+ |-- lib1
14
14
 
15
15
  | |-- hello.c
16
16
 
17
17
  | `-- hello.h
18
18
 
19
+ |-- lib2
20
+
21
+ | |-- hoge.c
22
+
23
+ | `-- hoge.h
24
+
19
25
  `-- src
20
26
 
21
27
  `-- sample.c
22
28
 
29
+
30
+
31
+ ```
32
+
33
+
34
+
35
+ ## リンク関係
36
+
37
+
38
+
39
+ ```
40
+
41
+ sample (実行バイナリ) --参照--> libhoge.so (共有ライブラリ) --参照--> libhello.so (共有ライブラリ)
42
+
23
43
  ```
24
44
 
25
45
 
@@ -38,19 +58,35 @@
38
58
 
39
59
 
40
60
 
61
+ # ライブラリのヘッダーがあるディレクトリを include ディレクトリに追加する。
62
+
63
+ include_directories(lib1 lib2)
64
+
65
+
66
+
41
- # 共有ライブラリ
67
+ # 共有ライブラリ1
42
68
 
43
69
  ############################################################
44
70
 
45
71
 
46
72
 
47
- set(LIBRARY_NAME "hello")
48
-
49
-
50
-
51
73
  # 共有ライブラリを作成する。
52
74
 
53
- add_library(${LIBRARY_NAME} SHARED lib/hello.c)
75
+ add_library(hello SHARED lib1/hello.c)
76
+
77
+
78
+
79
+ # 共有ライブラリ2
80
+
81
+ ############################################################
82
+
83
+
84
+
85
+ # 共有ライブラリを作成する。
86
+
87
+ add_library(hoge SHARED lib2/hoge.c)
88
+
89
+ target_link_libraries(hoge hello) # libhello.so をリンク
54
90
 
55
91
 
56
92
 
@@ -60,12 +96,6 @@
60
96
 
61
97
 
62
98
 
63
- # ライブラリのヘッダーがあるディレクトリを include ディレクトリに追加する。
64
-
65
- include_directories(lib)
66
-
67
-
68
-
69
99
  # 実行バイナリを作成する。
70
100
 
71
101
  add_executable(${PROJECT_NAME} src/sample.c)
@@ -74,17 +104,17 @@
74
104
 
75
105
  # ライブラリをリンクする。
76
106
 
77
- target_link_libraries(${PROJECT_NAME} hello)
107
+ target_link_libraries(${PROJECT_NAME} hoge) # libhoge.so をリンク
78
-
108
+
79
- ```
109
+ ```
80
-
81
-
82
-
110
+
111
+
112
+
83
- ## lib/
113
+ ## lib1/
84
-
85
-
86
-
114
+
115
+
116
+
87
- ライブラリのコード
117
+ ライブラリ1のコード
88
118
 
89
119
 
90
120
 
@@ -130,11 +160,59 @@
130
160
 
131
161
 
132
162
 
163
+ ## lib2/
164
+
165
+
166
+
167
+ ライブラリ1を利用するライブラリ2のコード
168
+
169
+
170
+
171
+ hoge.h
172
+
173
+ ```
174
+
175
+ #ifndef HOGE_H
176
+
177
+ #define HOGE_H
178
+
179
+
180
+
181
+ void hoge();
182
+
183
+
184
+
185
+ #endif // HOGE_H
186
+
187
+ ```
188
+
189
+
190
+
191
+ hoge.c
192
+
193
+ ```
194
+
195
+ #include "hello.h"
196
+
197
+
198
+
199
+ void hoge()
200
+
201
+ {
202
+
203
+ print_hello();
204
+
205
+ }
206
+
207
+ ```
208
+
209
+
210
+
133
211
  ## src/
134
212
 
135
213
 
136
214
 
137
- ライブラリ利用側のコード
215
+ ライブラリ2を利用するバイナリ
138
216
 
139
217
 
140
218
 
@@ -142,7 +220,7 @@
142
220
 
143
221
  ```
144
222
 
145
- #include "hello.h"
223
+ #include "hoge.h"
146
224
 
147
225
 
148
226
 
@@ -150,7 +228,7 @@
150
228
 
151
229
  {
152
230
 
153
- print_hello();
231
+ hoge();
154
232
 
155
233
  }
156
234
 
@@ -187,3 +265,147 @@
187
265
  Hello
188
266
 
189
267
  ```
268
+
269
+
270
+
271
+ ## 追記
272
+
273
+
274
+
275
+ ### ライブラリの作成
276
+
277
+
278
+
279
+ ```
280
+
281
+ add_library(hello SHARED hello.c)
282
+
283
+ ```
284
+
285
+
286
+
287
+ ビルドすると、libhello.so という共有ライブラリが作成されます。
288
+
289
+
290
+
291
+ ### 実行ファイルの作成
292
+
293
+
294
+
295
+ ```
296
+
297
+ add_executable(sample sample.c)
298
+
299
+ ```
300
+
301
+
302
+
303
+ ビルドすると、`sample` という実行バイナリが作成されます。
304
+
305
+
306
+
307
+ ### 共有ライブラリのリンク
308
+
309
+
310
+
311
+ ```
312
+
313
+ target_link_libraries(sample hello)
314
+
315
+ ```
316
+
317
+
318
+
319
+ 実行バイナリ `sample` に libhello.so をリンクします。
320
+
321
+
322
+
323
+ ### ライブラリの検索パス追加
324
+
325
+
326
+
327
+ ライブラリの検索パスに ./lib を追加
328
+
329
+
330
+
331
+ ```
332
+
333
+ link_directories(lib)
334
+
335
+ ```
336
+
337
+
338
+
339
+
340
+
341
+ ### インクルードディレクトリの検索パスに ./include を追加
342
+
343
+
344
+
345
+ ```
346
+
347
+ include_directories(include )
348
+
349
+ ```
350
+
351
+
352
+
353
+ ## 質問の CMakeLists.txt について
354
+
355
+
356
+
357
+ CMakeLists.txt がいろいろおかしいです。
358
+
359
+
360
+
361
+ ```
362
+
363
+ cmake_minimum_required(VERSION 3.5)
364
+
365
+ project(testProject)
366
+
367
+
368
+
369
+ # ${PROJECT_NAME} は project() で設定した名前で自動的に作られるため、不要
370
+
371
+ set(PROJECT_NAME testProject)
372
+
373
+
374
+
375
+ # 両方あるのは、おかしい
376
+
377
+ # 共有ライブラリなら add_library()
378
+
379
+ # 実行バイナリなら add_executable()
380
+
381
+ # あと libget.so のようにリンクする共有ライブラリはここに書く必要はない
382
+
383
+ add_executable(Main main.c)
384
+
385
+ add_library(my SHARED main.c libget.so)
386
+
387
+
388
+
389
+
390
+
391
+ find_library(LIBPATH
392
+
393
+ NAMES libget.so
394
+
395
+ HINTS /home/to2836/Desktop/workbench/test3
396
+
397
+ REQUIRED)
398
+
399
+
400
+
401
+ # target_link_libraries は add_executable() または add_library() の
402
+
403
+ # あとでなければならない
404
+
405
+ # 以下の記述は Main に libget.so をリンクしています。
406
+
407
+ # libmy.so が liget.so をリンクする記述が CMakeLists.txt にありません。
408
+
409
+ target_link_libraries(Main ${LIBPATH})
410
+
411
+ ```