gcc / -Wl,-Bsymbolic
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加密狗常见问题解答
- 下一篇: 对单片机通信方式(中断和轮询)的理解