程序运行时提示undefined symbol

limigy 2012-11-29 03:42:12
t1在调用t2.so的f1函数的时候(dlsym("./t2.so", "f1")),提示undefined symbol: f1
请问什么原因?
下面是源代码和makefile

//t1.cpp

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "t2.hpp"



int main(int argc, char **argv)
{
printf("t1 | main() begin\n");

int iReturn = 0;
void *FunctionLib = NULL; /* Handle to shared lib file */
int (*Function)(void*); /* Pointer to loaded routine */
char *dlError = NULL; /* Pointer to error string */

printf("t1 | main() | will dlopen\n");
FunctionLib = dlopen("./t2.so", RTLD_LAZY);
dlError = dlerror();
if( dlError )
{
printf("t1 | main() | %s\n", dlError);
return 1;
}

printf("t1 | main() | will dlsym\n");
Function = (int(*)(void*)) dlsym( FunctionLib, "f1");
dlError = dlerror();
if( dlError )
{
printf("t1 | main() | %s\n", dlError);
return 1;
}

char ch1[] = "this is a test";
printf("t1 | main() | will call so function\n");
iReturn = (*Function)(ch1);
printf("t1 | main() | iReturn = %d\n", iReturn);

printf("t1 | main() | will close so\n");
iReturn = dlclose(FunctionLib);
printf("t1 | main() | iReturn = %d\n", iReturn);
dlError = dlerror();
if( iReturn )
{
printf("t1 | main() | %s\n", dlError);
return 1;
}

return 0;
}




//t2.hpp


int f1(char*);





//t2.cpp

#include <stdio.h>

/*
int main(char *ch1)
{
printf("t2 | main() begin\n");
printf("t2 | main() %s\n", ch1);
return 100;
}
*/


int f1(char *ch1)
{
printf("t2 | f1() begin\n");
printf("t2 | f1() %s\n", ch1);
return 200;
}






//makefile


CC = g++ -fPIC -m32 -Wall
CCS = g++ -shared -m32 -Wall


clean:
-rm *.o *.so t1

t1:
$(CC) -o t1 t1.cpp -ldl


t2:
$(CC) -c -o t2.o t2.cpp


t3:
$(CCS) -o t2.so t2.o








//编译过程

#make t1
#make t2
#make t3




//执行过程

# ./t1
t1 | main() begin
t1 | main() | will dlopen
t1 | main() | will dlsym
t1 | main() | ./t2.so: undefined symbol: f1
...全文
9957 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
limigy 2012-11-29
  • 打赏
  • 举报
回复
明白了,c++编译后的文件会把函数名改名(为了实现重载功能) 用extern "C"声明后,就会使用c的方式进行编译,编译后的文件中仍然是定义的函数名 多谢各位
limigy 2012-11-29
  • 打赏
  • 举报
回复
引用 4 楼 derekrose 的回复:
你那个hpp啊,里面只有声明为什么要用hpp当后缀呢?
应该用啥后缀
derekrose 2012-11-29
  • 打赏
  • 举报
回复
你那个hpp啊,里面只有声明为什么要用hpp当后缀呢?
彭家老三 2012-11-29
  • 打赏
  • 举报
回复
引用 2 楼 limigy 的回复:
引用 1 楼 pengjialaosan 的回复:看样子是引文t2.cpp里没有包含t2.hpp 在t2.cpp中增加#include "t2.hpp"还是不行
那我也不知道什么问题了,帮顶等大神吧。
limigy 2012-11-29
  • 打赏
  • 举报
回复
引用 1 楼 pengjialaosan 的回复:
看样子是引文t2.cpp里没有包含t2.hpp
在t2.cpp中增加#include "t2.hpp"还是不行
彭家老三 2012-11-29
  • 打赏
  • 举报
回复
看样子是引文t2.cpp里没有包含t2.hpp

64,646

社区成员

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

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