亚洲AVI,黑人巨茎大战欧美白妇,初高中生洗澡自慰高清网站,欧美日韩无砖专区一中文字

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

GCC 使用庫(kù)文件名進(jìn)行鏈接

使用 GCC 進(jìn)行 C/C++ 代碼編譯時(shí),如果代碼中使用到了庫(kù)函數(shù),需要使用 -l 選項(xiàng)指定該庫(kù)函數(shù)所在的庫(kù)。如:-lm、-lrt-lpthread等。這種方式使用的是庫(kù)的縮寫(xiě)。一個(gè)庫(kù)的文件名如果是:libxxx.solibxxx.a,則可以使用 -lxxx 進(jìn)行鏈接。這種規(guī)則很常見(jiàn),但是缺點(diǎn)也很明顯。假設(shè)在一臺(tái) Linux 機(jī)器上,同時(shí)具有 libxxx.solibxxx.a,GCC 會(huì)優(yōu)先鏈接 libxxx.so。雖然,GCC 也提供了 -static 選項(xiàng)可以強(qiáng)制鏈接靜態(tài)庫(kù)。但是,這時(shí)候新的問(wèn)題出現(xiàn)了,假設(shè)有兩個(gè)庫(kù) xy,他們都具有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩個(gè)版本。如果我想要鏈接 libx.soliby.a,使用 -static 選項(xiàng)就無(wú)法滿足這個(gè)要求。我需要更加精細(xì)的控制,最好是直接根據(jù)文件名直接指定鏈接哪個(gè)版本的庫(kù)文件,就沒(méi)有任何歧義。

專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)內(nèi)蒙古免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

GCC 文檔的關(guān)于 -l 選項(xiàng)的描述沒(méi)有告訴我如何直接使用一個(gè)庫(kù)文件名。于是翻看 ld 的文檔。在關(guān)于 -l 選項(xiàng)的描述中,有這樣一段話:

If namespec is of the form ‘:filename’, ld will search the library path for a file called filename, otherwise it will search the library path for a file called ‘libnamespec.a’.

也就是說(shuō)可以使用 -l:filename 的形式直接指定庫(kù)文件名。這個(gè)只是 ld 的選項(xiàng),GCC 能不能直接使用還需要驗(yàn)證。設(shè)計(jì)三個(gè) .cpp 文件,分為 x.cpp y.cppmain.cpp。

// x.cpp
#include 

void print_x()
{
    std::cout << "x" << std::endl;
}
// y.cpp
#include 

void print_y()
{
    std::cout << "y" << std::endl;
}
// main.cpp
void print_x();
void print_y();

int main()
{
    print_x();
    print_y();
}

使用如下 Makefile 進(jìn)行編譯。x.cpp 編譯成 libx.solibx.a,y.cpp 編譯成 liby.soliby.a。main.cpplibx.soliby.a 編譯鏈接成 main.out。

all : main
	
x :
	gcc -o libx.so -shared -fPIC x.cpp
	gcc -o x.o -c x.cpp
	ar crs libx.a x.o

y :
	gcc -o liby.so -shared -fPIC y.cpp
	gcc -o y.o -c y.cpp
	ar crs liby.a y.o

clean :
	rm -f *.out *.o *.so *.a

main : x y
	gcc -o main.out main.cpp -Wl,-rpath=./  -lstdc++ -L. -l:libx.so -l:liby.a

能直接通過(guò)編譯,使用 ldd main.out 查看一下動(dòng)態(tài)庫(kù)依賴:

        linux-vdso.so.1 (0x00007ffe71ace000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f1bdea)
        libx.so => ./libx.so (0x00007f1bdea4f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f1bde)
        libm.so.6 => /lib64/libm.so.6 (0x00007f1bde)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1bdec7b000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f1bde74e000)

可以看到 libx.so 被動(dòng)態(tài)鏈接,而 liby.a 被靜態(tài)鏈接,沒(méi)有顯示。執(zhí)行 main.out,輸出結(jié)果也符合預(yù)期。

x
y

由此可見(jiàn),-l:filename 能直接用于 GCC。這種方法除了控制鏈接的庫(kù)是靜態(tài)的還是動(dòng)態(tài)的之外,還能用于控制庫(kù)的版本號(hào)。例如 libx.so 同時(shí)存在兩個(gè)版本 libx.so.1libx.so.2 ,可以使用 -l:libx.so.1 指定版本號(hào)為 1 的庫(kù)。


新聞標(biāo)題:GCC 使用庫(kù)文件名進(jìn)行鏈接
網(wǎng)站URL:http://news.spvevtbd.cn/article/dsogosc.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP