提问人:hikerjobs 提问时间:9/15/2023 最后编辑:hikerjobs 更新时间:9/23/2023 访问量:77
MacOS x86_64 C/汇编语言文件错误:ld:编译/链接程序集时找不到体系结构x86_64的符号
MacOS x86_64 error with C/assembly language file: ld: symbol(s) not found for architecture x86_64 when compiling/linking assembly
问:
我正在尝试从开源 git 存储库编译此文件:
https://github.com/xcist/main/blob/master/gecatsim/clib_build/src/p_nlog_inline.c
我在 MacOS x86_64 平台上。操作系统 v13.4
我可以使用以下命令编译该文件而不会出错:
g++ -O0 -g -Wall -static -msse -masm=intel -fPIC -c p_nlog_inline.c
使用特定于 MacOS 的 Makefile:https://github.com/xcist/main/blob/master/gecatsim/clib_build/MakeMacOS 当我尝试将 .o 文件与其他 .o 文件链接时,出现以下错误:
make -f ../MakeMacOS libcatsim_macos.so
.............................................
Building system-specific library .....
g++ -Wall -fPIC -O0 -static-libstdc++ -o libcatsim_macos.so -shared MatVec.o BaseObject.o ClipPlane.o Transformation.o Intersection.o Interpolate.o main.o Photon.o CrossSectionHandler.o Volume.o Detector.o CrossSection.o Phantom.o DD3Proj.o DD3Proj_roi_notrans_mm.o voxelized_projector.o getMemorySize.o negative_log.o gemsfilt.o pd3dbpsemi.o DD2Back.o DD2Proj.o DD2WBack.o DD3WBack.o pd2dbpcurved.o pd2dbpflat.o extractsino.o viewshift.o spline.o xybowtie.o DD2ParProj.o analytic_projector.o rndpoi.o nCAT_main.o fm_gethostid.o fm_getrandpid.o p_nlog_inline.o -fPIC
clang: warning: argument unused during compilation: '-static-libstdc++' [-Wunused-command-line-argument]
Undefined symbols for architecture x86_64:
"_p_nlog_inline", referenced from:
nlog(float*, float*, int) in negative_log.o
"and_mask", referenced from:
repeat in p_nlog_inline.o
"coeff1", referenced from:
repeat in p_nlog_inline.o
"coeff2", referenced from:
p_nlog_inline(float*, float*, int) in p_nlog_inline.o
"coeff3", referenced from:
repeat in p_nlog_inline.o
"coeff4", referenced from:
p_nlog_inline(float*, float*, int) in p_nlog_inline.o
"coeff5", referenced from:
p_nlog_inline(float*, float*, int) in p_nlog_inline.o
"coeff6", referenced from:
p_nlog_inline(float*, float*, int) in p_nlog_inline.o
"coeff7", referenced from:
repeat in p_nlog_inline.o
"coeff8", referenced from:
repeat in p_nlog_inline.o
"exp_mult", referenced from:
repeat in p_nlog_inline.o
"exp_sub", referenced from:
repeat in p_nlog_inline.o
"or_mask", referenced from:
p_nlog_inline(float*, float*, int) in p_nlog_inline.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libcatsim_macos.so] Error 1
我根据在线推荐尝试了几件事。我已经能够让它编译 .o 文件,但我被困在这个链接阶段。关于下一步该怎么做的任何想法?
[更新]:符号在相应的 .h 文件中定义,该文件位于此处:
https://github.com/xcist/main/blob/master/gecatsim/clib_build/src/p_nlog_inline.h
答:
0赞
Tom
9/15/2023
#1
错误是行:
g++ -Wall -fPIC -O0 -static-libstdc++ -o libcatsim_macos.so -shared MatVec.o BaseObject.o ClipPlane.o Transformation.o Intersection.o Interpolate.o main.o Photon.o CrossSectionHandler.o Volume.o Detector.o CrossSection.o Phantom.o DD3Proj.o DD3Proj_roi_notrans_mm.o voxelized_projector.o getMemorySize.o negative_log.o gemsfilt.o pd3dbpsemi.o DD2Back.o DD2Proj.o DD2WBack.o DD3WBack.o pd2dbpcurved.o pd2dbpflat.o extractsino.o viewshift.o spline.o xybowtie.o DD2ParProj.o analytic_projector.o rndpoi.o nCAT_main.o fm_gethostid.o fm_getrandpid.o p_nlog_inline.o -fPIC
正确的使用方法如下:
gcc -fPIC -somethingElse -c name.c -lXXXXXXXX -lXXXXXX
sudo ld -x --shared -o /lib/XXXXX/XXXXXXXX.so XXXXXX.o -lXXXXXX -lXXXXXX
评论
0赞
hikerjobs
9/15/2023
不幸的是,这没有奏效。显示有关未定义符号的更多错误。
0赞
Tom
9/15/2023
@hikerjobs 您能详细解释一下您是如何操作的吗? 目录可能是其他的,它只是示例。/lib/XXXXX/XXXXXXXX.so
0赞
Tom
9/15/2023
undefined symbols
意味着当你或错过一些东西时。gcc
ld
0赞
hikerjobs
9/23/2023
#2
经过大量实验,事实证明,我不得不在那些引发错误的变量前面添加一个 _(下划线)。例如,_coeff1 而不是 coeff1。 这与MacOS处理它的方式有关。奇怪。
评论
0赞
Peter Cordes
9/23/2023
是的,一些平台用前导下划线装饰 C 符号。这是确保寄存器名称和全局变量名称(如 或)之间永远不会有歧义的一种方法,尽管大多数 asm 语法要么完全避免这个问题(如 AT&T),要么有可选的语法来消除歧义(如 NASM)。无论如何,macOS 确实会引导下划线,而 Linux ELF 不适用于大多数/所有目标。古代 Linux a.out 做到了。Windows x64 没有,Windows x86(32 位)有。int eax
int r0
评论
p_nlog_inline
#define p_nlog_inline p_nlog