CMake 包含了头文件 找到了so动态库 链接时仍然出现undefined reference to 错误

今天遇到一个CMake 链接问题,这里提出来和大家分享:
问题:
自己用C语言写了一个动态:libword-counter.so,公开头文件word-counter.h, 其中有函数如:wc_get_word_freq()
自己用C++语言写了一个测试工程,在main函数中调用上述库函数wc_get_word_freq。
结果出现undefined reference to 的错误

分析:
1. 根据Cmake的编译log,可以看出该错误是在linking target的时候出现的,因此build是OK的
2. 如果修改头文件为其他文件,则出现找不到文件的错误,因此说明头文件可以正常找到。也在次说明1中build是没问题的
3. 编译选项我已经指明了需要加载的库 -lword-counter
4. 如果修改3中的库名,则出现找不到so的错误,说明3中编译选项是没问题的,系统能找到这个库so
5. 现在出现问题“undefined reference to 的错误”,太诡异了?
6. 本人一直坚信,计算机不会出现灵异事件,因此不断请教度娘
7. 发现有人建议我用nm命令查看so的符号表,看看这个函数是否正常,于是nm -D 库文件,查看了下,结果函数正常的。
8. 最后想到C++调用C存在混编问题,有人建议编译选项加上 -lstdc++,结果还是不行
9. 最终沿着混编问题走下去,我找到了原因,需要在库文件的头文件中加上下面的语句,用以指定,在编译C++的时候被调用的代码仍然使用C编译选项。

#ifdef __cplusplus
extern "C"
{
#endif



问题解决,希望遇到问题的小伙伴能看到,少走弯路~~

 

补充:

今天又遇到一个类似问题,找不到函数声明,extern c没问题,最终利用步骤7,发现so中没有符号表。

root cause:函数没有export出去

 

#ifndef EXPORT_API
#define EXPORT_API __attribute__((visibility("default")))
#endif


EXPORT_API
int get_download_info()

{

}

 

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
引用\[1\]:根据引用内容,你在使用Linux下的thread库进行多进程开发遇到了报错报错信息显示了undefined reference to `pthread_create'的错误。这个错误通常是由于缺少对pthread库的链接导致的。你可以尝试在编译选项中添加-lpthread来链接pthread库,例如:g++ main.cpp -lpthread。这样应该可以解决链接错误的问题。\[1\] 引用\[2\]:根据引用内容,你在分析问题发现了以下几点:1. 编译是没有问题的,错误是在链接目标出现的。2. 头文件可以正常找到,因为修改头文件出现找不到文件的错误。3. 编译选项已经指明了需要加载的库。4. 修改库名会出现找不到so的错误,说明编译选项是正确的。5. 出现undefined reference to的错误,需要进一步解决。6. 你在度娘上寻求帮助,但没有找到解决方案。7. 有人建议使用nm命令查看库文件的符号表,结果函数是正常的。8. 尝试了加上-lstdc++编译选项,但问题仍然存在。9. 最终发现是混编问题,需要在库文件的头文件中加上一段代码来指定在编译C++使用C编译选项。\[2\] 综上所述,你可以尝试在编译选项中添加-lpthread来链接pthread库,同在库文件的头文件中加上以下代码来解决混编问题: #ifdef __cplusplus extern "C" { #endif 这样应该可以解决你遇到的链接问题。\[2\] #### 引用[.reference_title] - *1* [cmake undefined reference to `pthread_create](https://blog.csdn.net/sexyluna/article/details/123529290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CMake 包含头文件 找到了so动态库 链接仍然出现undefined reference to 错误](https://blog.csdn.net/henry860916/article/details/50434228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值