gpt4 book ai didi

c++ - 为什么 "Multiple definitions linker error"当 nm 只看到一个定义

转载 作者:行者123 更新时间:2023-11-27 22:57:24 26 4
gpt4 key购买 nike

当将一些目标文件链接在一起时,我得到了一堆错误,例如:

obj-ia32/ShadowRoutine.o: In function `InitializeMap(unsigned int*)':
ShadowRoutine.cpp:(.text+0x0): multiple definition of `InitializeMap(unsigned int*)'
obj-ia32/ShadowRoutine.o:ShadowRoutine.cpp:(.text+0x0): first defined here

编译和链接命令:

g++ -DBIGARRAY_MULTIPLIER=1 -Wall -Wno-unknown-pragmas -fno-stack-protector \
-DTARGET_IA32 -DHOST_IA32 -DTARGET_LINUX -I../../../source/include/pin \
-I../../../source/include/pin/gen -I../../../extras/components/include \
-I../../../extras/xed-ia32/include -I../../../source/tools/InstLib -O3 \
-fomit-frame-pointer -fno-strict-aliasing -Wno-unused-variable \
-Wno-unused-function -I. -Ishadow-memory -m32 -c \
-o obj-ia32/ShadowRoutine.o ShadowRoutine.cpp
g++ -DBIGARRAY_MULTIPLIER=1 -Wall -Wno-unknown-pragmas -fno-stack-protector \
-DTARGET_IA32 -DHOST_IA32 -DTARGET_LINUX -I../../../source/include/pin \
-I../../../source/include/pin/gen -I../../../extras/components/include \
-I../../../extras/xed-ia32/include -I../../../source/tools/InstLib -O3 \
-fomit-frame-pointer -fno-strict-aliasing -Wno-unused-variable \
-Wno-unused-function -I. -Ishadow-memory -m32 -c \
-o obj-ia32/Jikes.o Jikes.cpp
g++ -shared -Wl,--hash-style=sysv -Wl,-Bsymbolic \
-Wl,--version-script=../../../source/include/pin/pintool.ver \
-m32 -o obj-ia32/Jikes.so obj-ia32/ClientReq.o obj-ia32/Server.o \
obj-ia32/ShadowRoutine.o obj-ia32/FncnMap.o obj-ia32/Trace.o \
obj-ia32/Jikes.o obj-ia32/ClientReq.o obj-ia32/Server.o \
obj-ia32/ShadowRoutine.o obj-ia32/FncnMap.o obj-ia32/Trace.o \
-L../../../ia32/lib -L../../../ia32/lib-ext -L../../../ia32/runtime/glibc \
-L../../../extras/xed-ia32/lib \
-L/home/karl/r/git/pin/source/tools/Jikes/zmq/inst/lib \
-lpin -lxed -lpindwarf -ldl -lzmq

仅有的两个目标文件InitializeMapJikes.oShadowRoutine.o :

$ nm obj-ia32/Jikes.o  | grep InitializeMap
U _Z13InitializeMapPj
$ nm obj-ia32/ShadowRoutine.o | grep InitializeMap
00000000 T _Z13InitializeMapPj
$ nm obj-ia32/* | grep InitializeMap
U _Z13InitializeMapPj
00000000 T _Z13InitializeMapPj

那么为什么我会得到“InitializeMap 的多个定义”,如果它仅在一个目标文件中“定义”,而在使用 extern 需要它的唯一其他目标文件中“未定义” ?

这是声明、定义和使用的样子:

$ grep -r InitializeMap *
Jikes.cpp: if (rtn_name == "sysInitializeMap") { RTN_INSERT_1(InitializeMap);
Binary file obj-ia32/Jikes.o matches
Binary file obj-ia32/ShadowRoutine.o matches
ShadowRoutine.cpp:VOID InitializeMap(ADDRINT *smID) { init_map(*(int*)smID); }
ShadowRoutine.hpp:VOID InitializeMap(ADDRINT *smID);

两个cpp文件在哪里#include "ShadowRoutine.hpp" .

编辑:我的问题是为什么链接器命令(上面第二个代码片段中的第三个 g++ 命令)即使 nm 也不起作用。表示该函数仅在 ShadowRoutine.o 的文本中定义和 undefinedJikes.o 中?

最佳答案

您的文件 obj-ia32/ShadowRoutine.o 在您的链接命令中列出了两次。

关于c++ - 为什么 "Multiple definitions linker error"当 nm 只看到一个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31466006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com