使用-fPIC编译C++代码出现段错误问题求助
排查段错误与编译目标的问题
首先得指出一个容易忽略的核心点:你用了-shared参数编译,这个参数是用来生成**动态链接库(.so文件)**的,不是生成可执行程序的!默认情况下,带-shared编译出来的a.out其实是个动态库,直接运行它肯定会触发段错误,这大概率是你当前问题的根源。
先修正编译目标
如果你的目的是生成可执行文件,把-shared去掉即可:
g++ -g -O3 -fPIC -lstdc++ -std=c++0x -I/home/nikesh.joshi/somepath/ main.cpp /home/nikesh.joshi/ml/somepath_apis/somepath/somefile.o
如果确实要生成动态库,记得指定输出文件名(比如libmylib.so)——动态库本身不能直接运行,得被其他程序链接调用:
g++ -g -O3 -fPIC -shared -lstdc++ -std=c++0x -I/home/nikesh.joshi/somepath/ main.cpp /home/nikesh.joshi/ml/somepath_apis/somepath/somefile.o -o libmylib.so
假设修正后仍有段错误?按这些步骤排查
如果生成了正确的可执行文件还是崩溃,咱们一步步定位问题:
- 用gdb精准定位错误位置:
这是排查段错误最直接的方法,能明确看到崩溃发生在代码哪一行、哪个函数:gdb ./a.out run # 启动程序,等待崩溃 bt # 打印调用栈,直接获取错误上下文 - 检查目标文件的PIC兼容性:
你提到要和其他静态库链接生成动态库,那所有参与编译的目标文件(包括somefile.o)都必须用-fPIC编译。如果somefile.o没加这个参数,链接时可能没报错,但运行时会触发异常。用这个命令检查:
如果输出有readelf -d /home/nikesh.joshi/ml/somepath_apis/somepath/somefile.o | grep TEXTRELTEXTREL,说明这个.o文件未使用-fPIC编译,需要重新编译该文件并加上-fPIC参数。 - 检查main.cpp的逻辑问题:
从你给出的代码片段看main函数不完整,但常见的段错误原因无非这几种:访问空指针/野指针、数组越界、栈溢出、调用未初始化的函数指针。补全代码后可以针对性排查这些点。 - 验证库依赖是否正常:
用ldd ./a.out查看可执行文件依赖的动态库是否都能正常找到,有没有缺失或者版本不匹配的情况。
小提示
-std=c++0x是C++11的旧写法,现在建议换成-std=c++11(或者更高版本比如c++17),兼容性会更好。
内容的提问来源于stack exchange,提问作者Nikesh Joshi
相关产品推荐
相关产品推荐

