"); //-->

狠狠做深爱婷婷久久一区,欧美日韩国内,久久麻豆精品传媒,久久久一区一区二区,色鬼伦理片,99视频精品久久,久久精品国产久久久久久,久久久伦理电影一区二,磁力天堂河北彩花

專欄中心

EEPW首頁 > 專欄 > gcc / -Wl,-Bsymbolic

gcc / -Wl,-Bsymbolic

發(fā)布人:電子禪石 時(shí)間:2023-07-04 來源:工程師 發(fā)布文章

一、問題

在動(dòng)態(tài)庫中含有全局變量 A,在應(yīng)用程序中也使用了全局變量 A,這個(gè)時(shí)候在應(yīng)用程序中修改全局變量 A 的時(shí)候也會(huì)修改動(dòng)態(tài)庫中的 A。如何不修改呢?


在創(chuàng)建動(dòng)態(tài)鏈接庫時(shí),gcc / g++ 選項(xiàng)中添加編譯選項(xiàng):


-Wl,-Bsymbolic


二、栗子

main.c


#include "tool.h"

#include <stdio.h>

 

int i = 100;

 

int main() {

  printf("main,i = %d\n",i);

  printData();

  return 0;

}

tool.h


void printData();

tool.c


#include "tool.h"

#include <stdio.h>

 

int i = 0;

 

void printData() { printf("tool,i = %d\n", i); }

CMakeLists.txt


cmake_minimum_required(VERSION 3.8)

set(TARGET_NAME main)

set(LIB_TARGET_NAME tmp)

 

set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")

 

project(${TARGET_NAME} LANGUAGES C CXX)

 

add_library(${LIB_TARGET_NAME} 

            SHARED 

            tool.c)

 

add_executable(${TARGET_NAME} 

            main.c)

 

target_link_libraries(${TARGET_NAME} 

            PRIVATE

            ${LIB_TARGET_NAME})

執(zhí)行下面命令: 


cmake . -Bbuild 


cmake --build build


./build/main


結(jié)果:


main,i = 100

tool,i = 100 


可以發(fā)現(xiàn),庫中代碼執(zhí)行了可執(zhí)行程序中的全局變量的定義。 


如果加上 -Wl,-Bsymbolic,即:


cmake_minimum_required(VERSION 3.8)

set(TARGET_NAME main)

set(LIB_TARGET_NAME tmp)

 

set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bsymbolic")

 

project(${TARGET_NAME} LANGUAGES C CXX)

 

add_library(${LIB_TARGET_NAME} 

            SHARED 

            tool.c)

 

add_executable(${TARGET_NAME} 

            main.c)

 

target_link_libraries(${TARGET_NAME} 

            PRIVATE

            ${LIB_TARGET_NAME})

結(jié)果:


main,i = 100

tool,i = 0 


 從結(jié)果可以發(fā)現(xiàn),加上 -Wl,-Bsymbolic 之后,庫中嗲嘛強(qiáng)制采用本地的全局變量的定義。

————————————————

版權(quán)聲明:本文為CSDN博主「Ruo_Xiao」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/itworld123/article/details/124476946


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

關(guān)鍵詞: gcc

相關(guān)推薦

Linux上安裝GCC3.4.0編譯器過程

基于Atmega16L的簡單音樂制作

AVRGCC/WinAVR編譯環(huán)境中斷函數(shù)的使用方法

winavr gcc快速入門

AVR 單片機(jī)GCC 程序設(shè)計(jì)

國嵌應(yīng)用班-1-1(GCC程序編譯)

視頻 2013-11-04

用arm-linux-gcc.4.3.2交叉編譯器編譯linux-3.0.1內(nèi)核

剖析C語言中a=a+++++a的無聊問題

AVR 單片機(jī)與GCC 編程V1.1版

交叉編譯鏈arm-linux-gcc-3.3.2在ubuntu10.04下的安裝

GCC 中文手冊(cè)

資源下載 2007-02-09

GCC-維基百科

Makefile的編寫指導(dǎo)

基于ARM11嵌入式遠(yuǎn)程監(jiān)控系統(tǒng)的分析與設(shè)計(jì)

ICC GCC傻傻分不清?聊一聊編譯器那些事兒

嵌入式系統(tǒng) 2017-05-17

在AVR Studio里使用AVR-GCC

更多 培訓(xùn)課堂
更多 焦點(diǎn)
更多 視頻

技術(shù)專區(qū)

任丘市| 吉木乃县| 阿荣旗| 芜湖县| 梅河口市| 河池市| 罗城| 那曲县| 当阳市| 鲜城| 青岛市| 宁晋县| 晋江市| 连平县| 岗巴县| 称多县| 青河县| 宣化县| 阿荣旗| 天祝| 澎湖县| 和林格尔县| 山东| 岑溪市| 集贤县| 乐东| 郓城县| 民和| 工布江达县| 图片| 竹山县| 曲松县| 民和| 鲜城| 弋阳县| 伊川县| 延边| 滨州市| 吉木萨尔县| 满洲里市| 油尖旺区|