回答編集履歴

5

よりよい修正方法を提案

2020/07/22 15:36

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -44,13 +44,13 @@
44
44
 
45
45
 
46
46
 
47
- 下記のように明示的にdynamic linkライブラリ直接指定すれば同様に動作するのではないかと思います。
47
+ 調べたところ、python3.8-config --ldflagsで表示されるディレクトリには、ダイナミックリンクライブラリがありませんでした!したがって下記のようにlibpython3.8.dylibが含まれる$PYTHONHOME/lib優先順位が高くなるように前の方に追記すれば同様に動作するのではないかと思います。
48
48
 
49
49
 
50
50
 
51
51
  ```terminal
52
52
 
53
- g++ -fPIC main.cpp $(python3.8-config --cflags --ldflags) $PYTHONHOME/lib/libpython3.8.dylib
53
+ g++ -fPIC main.cpp -L$PYTHONHOME/lib $(python3.8-config --cflags --ldflags) -lpython3.8
54
54
 
55
55
  ```
56
56
 

4

表現をより正確にした

2020/07/22 15:36

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- 上記の原因について掘り下げて調べていたところ、そもそもの原因は`libpython3.8がスタティックリンクされている`ことにあり、その結果、共有ライブラリ(math.cpython-38-darwin.so)が実行ファイル`main`に含まれた関数群を読みだせないことが分かりました。-rdynamicオプションにより解決したのは、mainに含まれた関数群シンボルテーブルでローカルとなっており、これを本オプションでグローバルへ移行したためです。
43
+ 上記の原因について掘り下げて調べていたところ、そもそもの原因は`libpython3.8がスタティックリンクされている`ことにあり、その結果、共有ライブラリ(math.cpython-38-darwin.so)が実行ファイル`main`に含まれた関数群を読みだせないことが分かりました。-rdynamicオプションにより解決したのは、mainに含まれた関数群を全てシンボルテーブルでグローバル領域と書き出したためです。
44
44
 
45
45
 
46
46
 

3

typoの修正

2020/07/22 15:21

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
  ```terminal
52
52
 
53
- g++ -fPIC main.cpp $(python3.8-config --cflags --ldflags) $PYTHONHOME/lib/python3.8.dylib
53
+ g++ -fPIC main.cpp $(python3.8-config --cflags --ldflags) $PYTHONHOME/lib/libpython3.8.dylib
54
54
 
55
55
  ```
56
56
 

2

日本語の修正

2020/07/22 15:18

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- 試しに下記のように明示的にdynamic linkライブラリを直接指定すれば、同様に動作するのではないかと思います。
47
+ 下記のように明示的にdynamic linkライブラリを直接指定すれば、同様に動作するのではないかと思います。
48
48
 
49
49
 
50
50
 

1

より良い方法の提案

2020/07/22 15:14

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -33,3 +33,37 @@
33
33
  ```
34
34
 
35
35
  とtwo level namespaceとなっていますので、この違いによりシンボル名が解決できなかったと思われます。
36
+
37
+
38
+
39
+ # 追記
40
+
41
+
42
+
43
+ 上記の原因について掘り下げて調べていたところ、そもそもの原因は`libpython3.8がスタティックリンクされている`ことにあり、その結果、共有ライブラリ(math.cpython-38-darwin.so)が実行ファイル`main`に含まれた関数群を読みだせないことが分かりました。-rdynamicオプションにより解決したのは、mainに含まれた関数群がシンボルテーブルでローカルとなっており、これを本オプションでグローバルへ移行したためです。
44
+
45
+
46
+
47
+ 試しに下記のように明示的にdynamic linkライブラリを直接指定すれば、同様に動作するのではないかと思います。
48
+
49
+
50
+
51
+ ```terminal
52
+
53
+ g++ -fPIC main.cpp $(python3.8-config --cflags --ldflags) $PYTHONHOME/lib/python3.8.dylib
54
+
55
+ ```
56
+
57
+
58
+
59
+ こちらの方法の方が
60
+
61
+ - コンパイル時間が短い
62
+
63
+ - mainのサイズも小さい
64
+
65
+ - -rdynamicによる副作用もない
66
+
67
+
68
+
69
+ と良い事づくめです。