dlopen在 mysql_init 段错误

czg2013czg 2013-01-23 03:10:11
我用动态链接库和mysql链接
main.cpp是这样的
#include <iostream>
#include <dlfcn.h>
#include<stdio.h>
#include<mysql/mysql.h>
int main(int argc,char ** argv) {
using std::cout;
using std::cerr;
char * word = argv[1];
cout << "C++ dlopen demo\n\n";

// open the library
cout << "Opening hello.so...\n";
dlopen("/usr/lib/mysql/libmysqlclient.so",RTLD_LAZY);
void* handle = dlopen("./hello.so", RTLD_LAZY);
int (*hello)(char *str);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
return 1;
}

// load the symbol
cout << "Loading symbol hello...\n";
// typedef void (*hello_t)();

// reset errors
dlerror();
hello = (int (*)(char *)) dlsym(handle, "test");
const char *dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol 'hello': " << dlsym_error <<
'\n';
dlclose(handle);
return 1;
}

// use it to do the calculation
cout << "Calling hello...\n";
(*hello)(word);
// printf("%s\n",(*hello("ffff")));
// close the library
cout << "Closing library...\n";
dlclose(handle);
}


hello.cpp是这样的
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <mysql/mysql.h>
#include <cstdlib>
extern "C" void hello() {
std::cout << "helo" << '\n';
}
extern "C" void test(char *str){
std::cout<<"test1"<<'\n';
MYSQL conn_ptr;
std::cout<<"test3"<<'\n';
mysql_init(&conn_ptr);
std::cout<<"test2"<<'\n';
if(mysql_real_connect(&conn_ptr,"127.0.0.1","root","","test",0,NULL,0)){
printf("success\n");
mysql_close(&conn_ptr);
}
else {
fprintf(stderr,"error");
if(mysql_errno(&conn_ptr)){
fprintf(stderr,"%d : %s",mysql_errno(&conn_ptr),mysql_error(&conn_ptr));
}
printf("connection failed\n");
}
mysql_close(&conn_ptr);
//return EXIT_SUCCESS;
}

在编译hello.cpp成.so文件时候报错
root@ubuntu:/srv/text/dlopen# g++ -shared -fPIC -L /usr/lib/mysql -lmysqlclient -o hello.so hello.cpp
hello.cpp: In function 'void test(char*)':
hello.cpp:27:9: error: return-statement with a value, in function returning 'void' [-fpermissive]
去掉最后一行之后编译没有问题

但是在运行./main的时候,只有输出了test1和test3,之后就是段错误
在mysql_init的时候
不知道是什么原因
...全文
236 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2013-01-23
  • 打赏
  • 举报
回复
只有一处可疑 test的返回类型是void. 在main.cpp里却用的是int型 不知道这个有没有关系。
lee_鹿游原 2013-01-23
  • 打赏
  • 举报
回复
引用 3 楼 czg2013czg 的回复:
把这里的代码copy回去,段错误没了 不知道怎么回事 弄了一下午 段错误自己会解决的吗
语法上没看出问题,可能和环境有关,楼主能调试看相关值,以及错误记录,翻阅相关资料,对照。
czg2013czg 2013-01-23
  • 打赏
  • 举报
回复
把这里的代码copy回去,段错误没了 不知道怎么回事 弄了一下午 段错误自己会解决的吗
lee_鹿游原 2013-01-23
  • 打赏
  • 举报
回复
去掉最后一行之后编译没有问题,那是因为 你的函数返回类型是void,只能return;
赵4老师 2013-01-23
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
内容概要:本文提出了一种面向通信优化的微电网分布式二次电压频率调控与功率均分方法,并通过Simulink平台进行了仿真实现。该方法针对孤岛微电网中多分布式电源的协同控制问题,采用分布式控制架构以减少对中央控制器的依赖,提升系统的可靠性与可扩展性。通过引入高效的通信机制与事件触发策略,在确保电压和频率快速精确恢复的同时,实现了各电源间有功与无功功率的均衡分配。文章详细阐述了控制算法的设计原理、稳定性分析过程以及关键参数的整定方法,并依托Simulink搭建完整的仿真模型,验证了所提方法在动态响应性能、抗干扰能力及通信资源利用率方面的优越性。; 适合人群:具备一定电力系统基础知识和仿真能力的研究生、科研人员及从事微电网、分布式能源系统相关工作的工程技术人员。; 使用场景及目标:①用于研究微电网中分布式电源的协调控制策略;②适用于需要实现电压频率恢复与负载功率均分的实际微电网系统设计;③为应对通信资源受限场景下的控制优化提供解决方案;④作为教学案例帮助理解分布式控制与二次调控机制。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注控制结构设计与参数整定部分,同时可延伸阅读文中提及的事件触发机制与弹性协同控制相关内容以加深理解。
内容概要:本文针对高比例清洁能源接入下的配电网重构问题,提出了一种融合需求响应机制的优化模型,并基于标准IEEE33节点系统进行仿真验证。研究通过引入需求响应策略,动态调节用户侧负荷,增强系统对风电、光伏等波动性可再生能源的消纳能力,同时结合网络拓扑重构以降低网损、改善电压分布,提升配电网运行的经济性与安全性。文中详细构建了计及辐射状约束、功率平衡与设备容量限制的混合整数非线性优化模型,采用智能优化算法求解开关操作序列与需求响应调度方案的协同最优解。通过Matlab编程实现仿真分析,验证了该方法在多重运行场景下的有效性与鲁棒性。; 适合人群:具备电力系统分析基础、熟悉Matlab编程工具,从事新能源并网、智能配电网优化、需求响应等领域研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于高渗透率分布式能源接入的配电网运行优化;②实现需求响应与网络重构的协同调度,提升系统灵活性与稳定性;③为智能配电网的规划、调度与决策支持提供技术参考与仿真平台。; 阅读建议:建议读者结合所提供的Matlab代码深入理解建模逻辑与算法实现流程,优先复现基础案例并逐步调整参数设置以探究不同需求响应强度、新能源出力波动等情景下的优化效果,亦可进一步扩展至多时段动态重构、储能协同优化等更复杂场景的研究。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧