-L和-rpath-link和-rpath

知識點

現代連接器在處理動態庫時將鏈接時路徑(Link-time path)和運行時路徑(Run-time path)分開,用戶可以通過-L指定連接時庫的路徑,通過-R(或-rpath)指定程序運行時庫的路徑,大大提高了庫應用的靈活性。
鏈接器ld的選項有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是這個意思:

-L: “鏈接”的時候,去找的目錄,也就是所有的 -l 選項里的庫,都會先從 -L 指定的目錄去找,然后是默認的地方。編譯時的-L選項并不影響環境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時庫的路徑,并不影響程序執行時庫的路徑,系統還是會到默認路徑下查找該程序所需要的庫,如果找不到,還是會報錯,類似cannot open shared object file。

-rpath-link:這個也是用于“鏈接”的時候的,例如你顯示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并沒有指定,而是 FOO.so 引用到它,這個時候,會先從 -rpath-link 給的路徑里找。

-rpath: “運行”的時候,去找的目錄。運行的時候,要找 .so 文件,會從這個選項里指定的地方去找。對于交叉編譯,交叉編譯鏈接器需已經配置 –with-sysroot 選項才能起作用。也就是說,-rpath指定的路徑會被記錄在生成的可執行程序中,用于運行時查找需要加載的動態庫。?

知識點2

? -Wa,<options> ? Pass comma-separated <options> on to the assembler
? -Wp,<options> ? Pass comma-separated <options> on to the preprocessor
? -Wl,<options> ? Pass comma-separated <options> on to the linker?

the?-rpath?option encodes the path in the binary, either as?DT_RPATH?or?DR_RUNPATH

通常,您不需要它,事實上,最好不要在可執行文件中對庫搜索路徑進行編碼(使用-rpath選項將路徑編碼為二進制,可以是DT_rpath或DR_RUNPATH)

注:我自己的一般方法是在可執行文件位于構建樹中,并依賴于構建樹中的其他庫時,將其與–rpath選項鏈接,以便于調試,但在安裝(make install,building packages)時,需要在不使用–rpath選項的情況下重新鏈接,并將查找共享庫的任務留給目標平臺的適當動態鏈接器配置,例如ld.so.conf。?

知識點3

binutils在2.22版本以后,默認把–no-copy-dt-needed-entries這個選項打開了。當打開了這個選項的時候,編譯器在鏈接的時候是不會遞歸的去獲取依賴動態庫的依賴項的,于是就會出現上述的問題。

? ?--copy-dt-needed-entries
? ?--no-copy-dt-needed-entries
? ? ? ?This option affects the treatment of dynamic libraries referred to by DT_NEEDED tags inside ELF dynamic libraries mentioned on the command line. ?Normally the linker won't add a DT_NEEDED
? ? ? ?tag to the output binary for each library mentioned in a DT_NEEDED tag in an input dynamic library. ?With --copy-dt-needed-entries specified on the command line however any dynamic
? ? ? ?libraries that follow it will have their DT_NEEDED entries added. ?The default behaviour can be restored with --no-copy-dt-needed-entries.

? ? ? ?This option also has an effect on the resolution of symbols in dynamic libraries. ?With --copy-dt-needed-entries dynamic libraries mentioned on the command line will be recursively
? ? ? ?searched, following their DT_NEEDED tags to other libraries, in order to resolve symbols required by the output binary. ?With the default setting however the searching of dynamic
? ? ? ?libraries that follow it will stop with the dynamic library itself. ?No DT_NEEDED links will be traversed to resolve symbols.
跟在–no-copy-dt-needed-entries它后面的庫都不會遍歷其依賴項,使用–copy-dt-needed-entries則相反。即可以遍歷所有依賴項目,保證編譯成功。

實例

//a.cc == main.cc
#include <iostream>
#include "b.h"int main()
{bbb();std::cout << "Hello world" << std::endl;return 0;
}//b.h-----
#pragma oncevoid bbb();//b.cc-----
#include <iostream>
#include "ccc.h"void bbb()
{ccc();std::cout << "Hello world" << std::endl;
}// ccc.h-----
#pragma once
void ccc();// ccc.cc-----
#include <iostream>void ccc()
{std::cout << "Hello world" << std::endl;
}

編譯過程1

$ g++ -fPIC -shared ccc.cc -o libccc.so
$ g++ -fPIC -shared b.cc -o libbbb.so -L. -lccc
# g++ a.cc -L. -lb 是不行的,具體看https://blog.csdn.net/zrq293/article/details/105969423
g++ a.cc -L. -lb -Wl,--copy-dt-needed-entries
/usr/bin/ld: warning: libccc.so, needed by ./libb.so, not found (try using -rpath or -rpath-link)
$ g++ a.cc -L. -lb -Wl,--copy-dt-needed-entries,-rpath-link=.
$ ./a.out
./a.out: error while loading shared libraries: libb.so: cannot open shared object file: No such file or directory
$ g++ a.cc -L. -lb -Wl,--copy-dt-needed-entries,-rpath-link=.,-rpath=.
tiantian@DESKTOP-UVN3KRD:~/code$ ./a.out
./a.out: error while loading shared libraries: libccc.so: cannot open shared object file: No such file or directory$ ldd a.outlinux-vdso.so.1 (0x00007ffff5585000)libb.so => ./libb.so (0x00007f44961f0000)libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4495fc0000)libc.so => ./libc.so (0x00007f4495fb0000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4495d80000)libccc.so => not foundlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4495c80000)/lib64/ld-linux-x86-64.so.2 (0x00007f4496215000)libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4495c60000)
$ export LD_LIBRARY_PATH=.
$ ./a.out
Hello world
Hello world
Hello world

cmake的擴展

默認cmake設置

set(CMAKE_SKIP_BUILD_RPATH FALSE) ? ? ? ? ? ? ? ? # 編譯時加上RPATH ?
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) ? ? ? ? # 編譯時RPATH不使用安裝的RPATH ?
set(CMAKE_INSTALL_RPATH "") ? ? ? ? ? ? ? ? ? ? ? # 安裝RPATH為空 ?
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) ? ? ?# 安裝的執行文件不加上RPATH ?
設置rpath

SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)?
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}/../lib")

  1. 默認情況下,這個PATH在構建產生的中間文件,是不增加的;而是只對安裝的目標有效。如果你想針對構建的中間文件也有效果,可以加上
  2. 手動指定添加的RPATH

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37552.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go學習-Day1

Go學習-Day1 個人博客&#xff1a;CSDN博客 打卡。 Go語言的核心開發團隊&#xff1a; Ken Thompson (C語言&#xff0c;B語言&#xff0c;Unix的發明者&#xff0c;牛人)Rob Pike(UTF-8發明人)Robert Griesemer(協助HotSpot編譯器&#xff0c;Js引擎V8) Go語言有靜態語言的…

MongoDB安裝

文章目錄 MongoDB安裝設置yum源安裝指定版本的mongodb配置文件連接MongoDB的工具MongoDBCompass MongoDB安裝 設置yum源 [rootWDQCVM sbin]# vim /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/red…

文件預覽/下載方式:通過二進制流(Blob)下載、或者通過文件Url下載

一、 通過二進制流&#xff08;Blob&#xff09;下載 1 、API請求時候帶上類型 /*** 文件--下載* */ export function download(fphm) {return axios({url: "/ynpst/download-invoice?fphm" fphm,method: get,responseType: blob}) }2、文件預覽和下載 /*** 預覽…

JavaScript如何執行語句

目錄 語法/詞法分析 預編譯 解釋執行 預編譯什么時候發生 js運行三步曲 預編譯前奏 預編譯步驟 鞏固基礎練習 語法/詞法分析 按語句塊的粒度解析成抽象語法樹 ,分析該js腳本代碼塊的語法是否正確&#xff0c;如果出現不正確&#xff0c;則向外拋出一個語法錯誤&#x…

第4章:決策樹

停止 當前分支樣本均為同一類時&#xff0c;變成該類的葉子節點。當前分支類型不同&#xff0c;但是已經沒有可以用來分裂的屬性時&#xff0c;變成類別樣本更多的那個類別的葉子節點。當前分支為空時&#xff0c;變成父節點類別最多的類的葉子節點。 ID3 C4.5 Cart 過擬合 缺…

文本挖掘 day5:文本挖掘與貝葉斯網絡方法識別化學品安全風險因素

文本挖掘與貝葉斯網絡方法識別化學品安全風險因素 1. Introduction現實意義理論意義提出方法&#xff0c;目標 2. 材料與方法2.1 數據集2.2 數據預處理2.3 關鍵字提取2.3.1 TF-IDF2.3.2 改進的BM25——BM25WBM25BM25W 2.3.3 關鍵詞的產生(相關系數) 2.4 關聯規則分析2.5 貝葉斯…

css冒號對齊

實現后的樣式效果 實現方式 html&#xff1a; <el-col v-if"item.showInSingle ! false" :span"6" style"padding: 4px 0"><label>{{ item.label }}&#xff1a;</label><span v-if"singleData[item.prop] ! 0 &…

iOS字體像素與磅的對應關系

注意&#xff1a;低于iOS10的系統&#xff0c;顯示的字寬和字高比高于iOS10的系統小。 這就是iOS10系統發布時&#xff0c;很多app顯示的內容后面出現…&#xff0c;因而出現很多app為了適配iOS10系統而重新發布新版本。 用PS設計的iOS效果圖中&#xff0c;字體是以像素&#x…

SRM訂單管理:優化供應商關系

一、概述SRM訂單管理的概念&#xff1a; SRM訂單管理是指在供應商關系管理過程中&#xff0c;有效管理和控制訂單的創建、處理和交付。它涉及與供應商之間的溝通、合作和協調&#xff0c;旨在實現訂單的準確性、可靠性和及時性。 二、SRM訂單管理的流程&#xff1a; 1. 訂單創…

關于onload事件

onload事件是在網頁中的所有內容&#xff08;包括圖片、樣式表、腳本等&#xff09;都加載完成后觸發的事件。它常用于在頁面加載完成后執行一些操作&#xff0c;例如初始化頁面元素、綁定事件監聽器等。 可以通過以下方式來使用onload事件&#xff1a; 在HTML標簽中直接添加…

NGINX源碼安裝

文章目錄 NGINX源碼安裝安裝依賴包獲取源碼NGINX官方網站各個目錄的用途 編譯安裝安裝結束后的文件設置為服務 NGINX源碼安裝 安裝依賴包 root執行 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel這些包是用于開發和構建軟件…

遞歸的用法和例子

b站視頻&#xff1a;https://www.bilibili.com/video/BV1iS4y1e7MJ/?spm_id_from333.999.0.0&vd_source1717654b9cbbc6a773c2092070686a95 # 遞歸的定義&#xff1a;其實就是自己調用自己&#xff0c;一般用函數的形式來進行 """ 特點&#xff1a; 1、一定…

item_review-獲得TB商品評論

一、接口參數說明&#xff1a; item_review-獲得TB商品評論&#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_review 名稱類型必須描述keyString是調用key&#xff08;點擊獲取…

輕拍牛頭(約數)

題意&#xff1a;求ai在n個數中&#xff0c;ai可以整除的數有多少個&#xff0c;不包括ai自己。 分析&#xff1a;暴力寫需要n^2的時間復雜度&#xff0c;此時想一下預處理每個數的倍數&#xff0c;約數和倍數是有關系的&#xff0c;把每個數的倍數都加上1. #include<bits…

騰訊云SA3服務器AMD處理器CPU網絡帶寬性能詳解

騰訊云AMD服務器SA3實例CPU采用2.55GHz主頻的AMD EPYCTM Milan處理器&#xff0c;睿頻3.5GHz&#xff0c;搭載最新一代八通道DDR4&#xff0c;內存計算性能穩定&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達1900萬pps&#xff0c;最高內網帶寬可支持100Gbps。騰訊云…

typeScript 之 運算符

工具&#xff1a; PlayGround 算術運算符 運算符描述加-減*乘/除%取模(求余)自增–自減 注意和--&#xff0c;實例&#xff1a; let value 0; console.log(value); //0, 先顯示再增加后為1 console.log(value); //2&#xff0c;先增加后為2再顯示關系運算符 運算符描述 …

list.stream.filter,List<List>轉換為List

1.filter過濾 返回符合查詢條件的集合//過濾所有deviceType為1的List<DeviceWorkTimeEntity> list entities.stream().filter(a -> "1".equals(a.getDeviceType())).toList(); 2.List<List>轉換為List 可以使用流(Stream)的flatMap操作 public cl…

嵌入式Linux驅動開發系列五:Linux系統和HelloWorld

三個問題 了解Hello World程序的執行過程有什么用? 編譯和執行&#xff1a;Hello World程序的執行分為兩個主要步驟&#xff1a;編譯和執行。編譯器將源代碼轉換為可執行文件&#xff0c;然后計算機執行該文件并輸出相應的結果。了解這個過程可以幫助我們理解如何將代碼轉化…

從一到無窮大 #10 討論 Apache IoTDB 大綜述中看到的優劣勢

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言問題定義新技術數據模型schemalessTsfile設計雙MemTable高級可擴展查詢其他 IotD…

兩天入門Linux、搭建Spring環境 第一天

一、Linux簡介 1.什么是Linux 一個操作系統&#xff0c;未來公司里面會用到、接觸的新操作系統。 2.為什么學Linux (1)個人職務需要&#xff0c;肯定會接觸到Linux (2)職業發展&#xff0c;以后的發展肯定需要掌握Linux的許多使用方法 3.學哪些內容 (1)Linux基本介紹 (2)…