【发布时间】:2018-12-07 03:34:25
【问题描述】:
我有两个头文件和两个 cpp 文件:
//f1.h
int f1();
//f1.cpp
include "f1.h"
int f1() {return 1;}
//f2.h
int f2();
//f2.cpp
#include "f2.h"
#include "f1.h"
int f2() {return f1() + 1;}
//main.cpp
#include "f2.h"
int main() {return f2();}
首先,我从f1 和f2 编译一个共享对象,然后根据该共享对象从main.cpp 创建一个二进制文件:
g++ -c -fPIC -shared f1.cpp f2.cpp
g++ -shared -fPIC -o libf.so f2.o f1.o
g++ -o dynamic main.cpp libf.so
现在我对f1.cpp 进行一些更改(比如f1 现在返回2):
//f1.cpp#
include "f1.h"
int f1() {return 2;}
并按如下方式编译二进制文件:
g++ -o semistatic main.cpp f1.cpp libf.so
问题是“半静态”二进制文件是使用来自libf 的f1() 定义(其中f1 返回1)还是使用静态链接符号(其中f1 返回@987654338 @)?这是否在不同系统中有所不同?我可以依靠这在单个系统中保持一致吗?
【问题讨论】:
-
您找到了一种复杂的方法来打破单一定义规则。见en.cppreference.com/w/cpp/language/definition
标签: c++ dynamic static linker shared-libraries