You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:06:28