Home ld找不到動態函式庫的除錯方法
Post
Cancel

ld找不到動態函式庫的除錯方法

注意是否有從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檔沒有被連接

  1. 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檔會被編譯,確認是否有將程式加入

This post is licensed under CC BY 4.0 by the author.

Deepstream辨識結果遠端觀看

Ubuntu-cli-網路狀態檢查