注意是否有從C++ 呼叫C語言的函式,如果有必須要使用extern C
https://hackmd.io/@rhythm/HyOxzDkmD
https://www.airs.com/blog/archives/38
https://www.google.com/search?q=Linkers+part+site%3Ahttps%3A%2F%2Fwww.airs.com%2F&rlz=1C1GCEU_zh-TWTW902TW902&oq=Linkers+part+site%3Ahttps%3A%2F%2Fwww.airs.com%2F&gs_lcrp=EgZjaHJvbWUyBggAEEUYOdIBCDM1ODlqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8#ip=1
注意function是否為static function
c語言中的static function在function被定義的檔案以外的scope是看不到的
undefined reference to
表示必要的函式庫或是.o檔沒有被連接
- 用
nm
指令確認函式確實存在.so檔裡面例如:nm -D libnvds_utils.so --defined-only
的輸出如下,這個指令只會列出有對外開放的函式1 2 3 4 5 6
0000000000001470 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
https://stackoverflow.com/a/4514781
- 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 17
0000000000000000 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ld: mode aarch64linux
attempt to open /usr/local/lib/aarch64-linux-gnu/libjpeg.so failed
attempt to open /usr/local/lib/aarch64-linux-gnu/libjpeg.a failed
attempt to open /lib/aarch64-linux-gnu/libjpeg.so failed
attempt to open /lib/aarch64-linux-gnu/libjpeg.a failed
attempt to open /usr/lib/aarch64-linux-gnu/libjpeg.so failed
attempt to open /usr/lib/aarch64-linux-gnu/libjpeg.a failed
attempt to open /usr/local/lib/libjpeg.so failed
attempt to open /usr/local/lib/libjpeg.a failed
attempt to open /lib/libjpeg.so failed
attempt to open /lib/libjpeg.a failed
attempt to open /usr/lib/libjpeg.so failed
attempt to open /usr/lib/libjpeg.a failed
attempt to open /usr/aarch64-linux-gnu/lib/libjpeg.so failed
attempt to open /usr/aarch64-linux-gnu/lib/libjpeg.a failed
ld: cannot find -ljpeg
注意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檔會被編譯,確認是否有將程式加入