日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc / -Wl,-Bsymbolic

發布時間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc / -Wl,-Bsymbolic 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題

在動態庫中含有全局變量?A,在應用程序中也使用了全局變量 A,這個時候在應用程序中修改全局變量 A 的時候也會修改動態庫中的 A。如何不修改呢?

在創建動態鏈接庫時,gcc / g++ 選項中添加編譯選項:

-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})

執行下面命令:?

cmake . -Bbuild?

cmake --build build

./build/main

結果:

main,i = 100
tool,i = 100?

可以發現,庫中代碼執行了可執行程序中的全局變量的定義。?

如果加上?-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})

結果:

main,i = 100
tool,i = 0?

?從結果可以發現,加上 -Wl,-Bsymbolic 之后,庫中嗲嘛強制采用本地的全局變量的定義。

(SAW:Game Over!)?

總結

以上是生活随笔為你收集整理的gcc / -Wl,-Bsymbolic的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。