我正在尝试从开源 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
错误是行:
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