ld找不到動態函式庫的除錯方法
注意是否有從C++ 呼叫C語言的函式,如果有必須要使用extern C
https://hackmd.io/@rhythm/HyOxzDkmD
https://www.airs.com/blog/archives/38
注意function是否為static function
c語言中的static function在function被定義的檔案以外的scope是看不到的
undefined reference to
表示必要的函式庫或是.o檔沒有被連接
- 用
nm
指令確認函式確實存在.so檔裡面例如:nm -D libnvds_utils.so --defined-only
的輸出如下,這個指令只會列出有對外開放的函式https://stackoverflow.com/a/45147811
2
3
4
5
60000000000001470 T nvds_dependencies_version_print
00000000000018d0 T nvds_mask_utils_resize_to_binary_argb32
00000000000013f0 T nvds_version
0000000000001410 T nvds_version_print
0000000000001310 T _Z18libnvds_utils_initv
0000000000001300 T _Z20libnvds_utils_deinitv
- nm不只可以用在函式庫檔,.o檔也可以用
nm deepstream_source_bin.o --defined-only
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
170000000000000000 b install_mux_eosmonitor_probe
0000000000000010 b last_reset_time_global.31491
0000000000000008 b mutex.31460
00000000000030a8 t nvstreammux_eosmonitor_probe_func
0000000000006ab0 T reset_encodebin
00000000000065e8 T reset_source_pipeline
000000000000133c t restart_stream_buf_prob
0000000000002ffc t rtspsrc_monitor_probe_func
0000000000001270 t seek_decode
0000000000000020 t set_camera_csi_params
00000000000000bc t set_camera_v4l2_params
0000000000006a04 T set_source_to_playing
0000000000002178 t smart_record_callback
0000000000002270 t smart_record_event_generator
0000000000002e74 t watch_source_async_state_change
00000000000026d0 t watch_source_status
...
/usr/bin/ld: cannot find …
編譯過程中發現ld找不到某個函式庫例如/usr/bin/ld: cannot find -ljpeg
,可以利用指令ld <函式庫> --verbose
可以查看ld找了那些路徑,例如目前ld找不到-ljpeg
可以利用ld -ljpeg --verbose
,輸出如下
1 | ld: mode aarch64linux |
注意makefile的擺放順序
連接器指令放最後面
例如
1 | gcc -I/usr/local/include -o yaml_reader yaml_reader.c -L/usr/local/lib -lfyaml |
https://stackoverflow.com/questions/22426574/gcc-undefined-reference-to
https://stackoverflow.com/questions/16710047/usr-bin-ld-cannot-find-lnameofthelibrary
注意cmake是否有把程式加入編譯
add_executable(…)內加入的cpp檔會被編譯,確認是否有將程式加入
ld找不到動態函式庫的除錯方法