CMake编译C++共享库遇undefined reference to `main'等链接错误求助
问题分析与解决方案
错误根源
1. "undefined reference to `main'" 错误
手动添加的-I/usr/include/c++/等包含路径干扰了CMake的默认编译链接逻辑:CMake会自动处理C++标准库的头文件路径,手动指定错误/冗余的路径会导致链接阶段错误引入可执行文件的启动代码(如Scrt1.o),从而错误要求main函数。
2. 重定位错误(relocation ... recompile with -fPIC)
虽然CMake默认会为SHARED库添加-fPIC(位置无关代码)编译选项,但手动修改CMAKE_CXX_FLAGS的操作可能破坏了这个默认设置,导致编译出的目标文件不满足共享库的要求。
修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(foobar) # 移除冗余的手动包含路径设置,CMake会自动处理标准库和默认包含目录 # 若需添加额外包含路径,使用target_include_directories(推荐的目标导向语法): # target_include_directories(foobar PRIVATE ${CMAKE_INCLUDE_PATH}) add_library(foobar SHARED src/foobar.cpp)
验证步骤
- 清理旧构建文件:
rm -rf CMakeCache.txt CMakeFiles/ Makefile - 重新生成构建文件并编译:
cmake . make
此时会正常生成libfoobar.so共享库,两个链接错误均会被解决。
内容的提问来源于stack exchange,提问作者Étienne
相关产品推荐
相关产品推荐

