系统:Centos
我有一个C文件,一个汇编文件和一个GYP文件:
C文件:src/node_main.cc
#include <iostream>
using namespace std;
extern "C" {
extern char __attribute__((weak)) global_variable;
} // extern "C"
int main()
{
printf("global_variable:%p", reinterpret_cast<uintptr_t>(&global_variable));
return 0;
}
字符串
装配文件:src/global_variable.S
.global global_variable
global_variable:
型
GYP文件:node.gyp
{
'targets': [
{
'target_name': 'global_variable',
'type': 'none',
'conditions': [
[ 'OS in "linux freebsd solaris"', {
'type': 'static_library',
'sources': [
'src/global_variable.S'
]
}],
]
},
{
'target_name': 'myexperiment',
'type': 'executable',
'sources': [
'src/node_main.cc'
],
'dependencies': [ 'global_variable' ],
'conditions': [
[ 'OS in "linux freebsd"', {
'dependencies': [ 'global_variable' ],
# 'ldflags+': [
# '<(PRODUCT_DIR)/obj.target/global_variable/src/global_variable.o'
# ]
}]
]
}
]
}
型
我的生成命令:
python3 main.py
make
型
我的问题是:当我注解掉“ldflags+”时,我无法访问“global_variable”:
./out/Default/myexperiment
型
执行“myexperiment”将打印“global_variable:(nil)"。
当我使用“ldflags”时,我可以访问“global_variable”,它将打印“global_variable:0x 4006 e6”。
我使用“make -n”命令,并尝试使用“ldflags+"查看g++发生了什么:
g++ -o out/Default/myexperiment out/Default/obj.target/global_variable/src/global_variable.o -Wl,--start-group out/Default/obj.target/myexperiment/src/node_main.o out/Default/obj.target/libglobal_variable.a -Wl,--end-group
型
不使用“ldflags+":
g++ -o out/Default/myexperiment -Wl,--start-group out/Default/obj.target/myexperiment/src/node_main.o out/Default/obj.target/libglobal_variable.a -Wl,--end-group
型
似乎唯一的区别是:“global_variable.o”。
如果添加了“global_variable.o”,则可以访问全局变量,否则全局变量为nil,尽管两者都添加了“libglobal_variable. a”。
完全糊涂了。
1条答案
按热度按时间ajsxfq5m1#
今天我做了很多实验,花了两天时间才弄明白。
终于找到了钥匙:第一个月
当
weak
与静态库一起使用时,链接器将不会尝试从静态库中查找定义,因此该定义将被丢弃。当与目标文件链接时,链接器将无条件地将其链接到输出文件。
所以它与汇编程序和GYP无关。这是因为我没有完全理解
.a
文件如何与链接器一起工作。这个答案对我帮助很大:https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries#:~:text= The%20weak%20attribute%20causes%20the,targets%2C%20and%20also%20for%20a.
谢谢大家!