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

提问人:hikerjobs 提问时间:9/15/2023 最后编辑:hikerjobs 更新时间:9/23/2023 访问量:77

问:

我正在尝试从开源 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

C macOS 程序集 链接器错误

评论

0赞 0___________ 9/15/2023
启用优化(如果它们是内联的)
0赞 Some programmer dude 9/15/2023
这些符号在哪里定义(实现)?在汇编程序文件中?在 C 源文件中?在图书馆里?
0赞 hikerjobs 9/15/2023
谢谢你的问题。我更新了帖子以反映符号的定义位置。
0赞 Jester 9/15/2023
我假设编译器现在足够聪明,即使没有优化,也可以删除未使用的常量。试图依靠这一点从一开始就没有发生是很糟糕的。这也是非常糟糕的内联 asm。
1赞 Jester 9/15/2023
如果您只想编译它,请将其删除,也许非内联版本对于您的目的来说足够快。p_nlog_inline#define p_nlog_inline p_nlog

答:

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意味着当你或错过一些东西时。gccld
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 eaxint r0