我正在尝试使用 .o 、.so、.a 文件创建可执行文件。
这是我的构建命令:-
pkgs/gcc/v4.8.3/bin/gcc -L/usr/X11R6/lib -O2 -DUSE_FLEX -Wall -Wno-char-subscripts -fPIC -DLINUX -DG_DISABLE_CONST_RETURNS -fno-strict-aliasing -o ../build/kl/Release/test/bin/pure.exe -L../build/kl/Release/test/modules ../build/kl/Release/test/maker/constrfunc.TCL.o ../../build/kl/Release/test/maker/pvdbprocs.TCL.o .. ../build/kl/Release/test/maker/maker/memmaker.TCL.o .. ../build/kl/Release/test/maker/modules/libdenbase.a .. ../build/kl/Release/test/maker/guibase.o -litk3.2 -litcl4.0.0 -ltk8.3 -lcdnviptcl8.4 -litclstub4.0.0 -ldenbase -lglib-2.0 -ldenbase -lX11 -ldl -lm -lviputil -lvippli -lcdsCommonMT_sh -lpthread -L/home/dlb/extlibs/arm/lib
我的库在路径 "-L/home/dlb/extlibs/arm/lib" 处具有函数的定义。仍然在下面抛出错误。
Error:
../build/kl/Release/test/maker/guibase.o: In function `decodeAddrList':
tree234.c:(.text+0xc): undefined reference to `ptritclStubsPtr'
tree234.c:(.text+0x20): undefined reference to `ptrlitclStubsPtr'
tree234.c:(.text+0x12c): undefined reference to `ptrlitclStubsPtr'
tree234.c:(.text+0x140): undefined reference to `ptrlitclStubsPtr'
我在库中有符号,位于路径 /home/dlb/extlibs/arm/lib :-
命令:-
readelf -s libitcl4.0.0.so | grep ptrlitclStubsPtr
348: 0000000000060f10 8 OBJECT LOCAL DEFAULT 24 ptrlitclStubsPtr
我在这里错过了什么吗?
请注意,OP 在同一问题的转发中提供了更多信息;
引用OP评论:
“由于一些隐私问题...我正在重命名符号..它是由我编辑的...这是拼写错误...我刚刚更正了它...:)”
IE。错误消息和 grep 行中的标识符以及 grep 行的输出已被手动更改。
看起来你要问的功能是local到定义它们的文件。也就是说,看起来它们明确不打算(甚至不允许)从外部调用。
也就是说,共享库源代码中的某个位置libitcl4.0.0.so
可能会出现这样的声明:
static tclStubs *ptrlitclStubsPtr;
那个关键词static
表明能见度结果符号的ptrlitclStubsPtr
仅限于其自己的源文件。
我从你报道的事实中推断出这一切readelf
输出包括行
348: 0000000000060f10 8 OBJECT LOCAL DEFAULT 24 ptrlitclStubsPtr
那面旗帜LOCAL
表明该符号是本地的。如果它是全局的,打算(并且能够)从外部调用,则该标志GLOBAL
将会出现。
为什么变量被设为私有(static
)像这样,所以你不能使用它们?这是一个软件工程的东西,“信息隐藏”,旨在减少你和图书馆之间的界面“宽度”libitcl4
。私有符号与内部的实现决策更加紧密地联系在一起libitcl4
,决定是not应该对呼叫者可见或有任何关注。人们认为,如果调用者能够访问这些符号,调用者还必须知道其他实现细节,这意味着作者libitcl4
然后将无法在不破坏(无效)调用代码的情况下更改这些实现细节。因此,为了防止出现这种情况,通常会做出选择,使调用者不可能以这种方式变得依赖。
在这种情况下,你基本上有三种前进路径:
去除static
源中变量声明的标签libitcl4.0.0.so
。 (这显然要求您有权访问源libitcl4.0.0.so
,以及重建它的能力。这也可能是一个非常糟糕的主意。正如我所解释的,这些符号被设为静态可能是有充分理由的。)
添加一个新函数libitcl4.0.0.so
它会执行您需要完成的任何操作,并且由于它位于同一源文件中,因此它确实可以访问这些符号。 (这也要求您有权访问并能够重建“libitcl4.0.0.so”。)
利用现有的公共设施,寻找其他方式来做您需要做的事情libitcl4.0.0.so
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)