CMake编译C++程序时出现undefined reference错误求助
解决CMake链接共享库时的undefined reference错误
问题分析
你遇到的链接错误根源在于:编译共享库时启用了-fvisibility=hidden编译选项,但未显式导出MyTest类的符号,导致共享库libmylib.so中没有包含MyTest::MyTest()和MyTest::add()的可访问符号,链接可执行文件app时无法找到这些定义。
你的CMakeLists.txt中设置了全局符号隐藏规则:
set(RELEASE_FLAGS "-O3 -fvisibility=hidden -fPIC")
该选项会将所有未显式标记为可见的符号默认隐藏,而你的MyTest类及其成员函数没有添加可见性声明,因此它们的符号不会被导出到共享库中。
解决方案
有两种可行的修复方式:
方式一:显式导出类符号
在头文件中为MyTest类添加可见性属性,告知编译器导出该类的所有成员符号:
修改lib.h:
__attribute__((visibility("default"))) class MyTest { public: MyTest(); void add(); };
__attribute__((visibility("default")))是GCC/Clang的专属属性,用于标记符号为可见,编译共享库时会自动导出该类的所有成员函数符号。
方式二:移除全局隐藏可见性的编译选项
如果你不需要对所有符号进行隐藏,可以删除RELEASE_FLAGS中的-fvisibility=hidden和CMAKE_CXX_FLAGS中的-fvisibility-inlines-hidden:
修改CMakeLists.txt中的编译选项部分:
set(RELEASE_FLAGS "-O3 -fPIC") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${RELEASE_FLAGS} -fno-omit-frame-pointer")
这样默认所有符号都是可见的,共享库会正常导出MyTest类的成员函数。
验证
无论选择哪种方式,执行以下步骤重新编译即可:
rm -rf build && mkdir build && cd build cmake .. make
此时链接错误会消失,可执行文件app能正常生成并运行。
内容的提问来源于stack exchange,提问作者user2448361
相关产品推荐
相关产品推荐

