当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求助!关于c++编写和引用.so的问题,总是出错.
帖子发表于 : 2011-01-06 11:20 

注册: 2010-03-27 17:23
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
我在网上看了一些关于.so 的问题,然后想自己编一编实验一下。
基本上就是按照网上的教程做的,但是还是有问题,请各位帮忙看看好吗?
代码:
//cpp_fun.h 是libcpp_fun.so的头文件
#ifndef CPP_FUN_H
#define   CPP_FUN_H



#endif   /* CPP_FUN_H */
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <iostream>
#include <string>
using namespace std;

#ifdef __cplusplus
extern "C"
{
#endif
void msg();

#ifdef __cplusplus
}
#endif



代码:
//cpp_fun.cpp  是libcpp_fun.so的源文件
#include "cpp_fun.h"

void msg(){
    string s = "这是C++的动态函数库的程序,吼吼!";
    cout<<s<<endl<<s<<endl;
}

int main(){
    msg();
    return 0;
}



代码:
//这是我想调用libcpp_fun.so 的程序
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <iostream>

using namespace std;
/*
 *
 */
int main(int argc, char** argv) {
    void (*msg)();
    string so("/home/zqm/Workspace/cpp_fun/dist/Debug/GNU-Linux-x86/libapp_fun.so");
    void *pdlHandle = dlopen(so.c_str(),RTLD_NOW);
    char *pzxErr = dlerror();
    if(!pdlHandle){
        std::cerr<<"错误!没有链接到libapp_fun.so。"<<std::endl<<pzxErr<<std::endl<<std::endl;
    }
    msg = (void(*)())dlsym(pdlHandle, "msg");
    pzxErr = dlerror();
    if(pzxErr != NULL){
        std::cerr<<pzxErr<<std::endl;
    }
    msg();
    dlclose(pdlHandle);
    return 0;
}


我是用NetBeans写的,最后的结果总是:
错误!没有链接到libapp_fun.so。
/home/zqm/Workspace/cpp_fun/dist/Debug/GNU-Linux-x86/libapp_fun.so: cannot open shared object file: No such file or directory

/home/zqm/Workspace/cpp_app/dist/Debug/GNU-Linux-x86/cpp_app: undefined symbol: msg
Segmentation fault
按 [Enter] 键关闭终端..
.

真的不知道该怎么改了,求教。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求助!关于c++编写和引用.so的问题,总是出错.
帖子发表于 : 2011-01-07 6:45 

注册: 2010-12-23 10:23
帖子: 120
送出感谢: 0 次
接收感谢: 4
我今天也在试怎么用链接库,哈哈。
不过我使用的 eclipse 做的,所以不完全清楚你的情况。
说下我的看法吧:

首先你的 lipcpp 里面不需要写main 函数,因为lib的作用只是提供额外的函数。

然后,lipcpp编译好之后会有一个 .so 文件,但是 你在编译 主函数时,编译器是不知到要连接到 这个 .so 文件的。所以你必须显示的告诉它。
i)你找一下project 属性 一类的设置, compiler, linker 是关键词。 应该有设置 library 的地方, 把你的 .so 文件名敲进去。
这里有一个问题,一般编译好的 .so 文件明是 libNAME.so 然后你之用输入 NAME 就行了,它会自动吧 文件名补全。总之你两个都试一下吧。
ii)不过光告诉要链接 .so文件还是不够的,因为编译器并不知道这个 .so 在哪里。 如果你没有把它放到默认路径下面的话,还是会报错。
在上面填 NAME 的地方附近,应该有一个设置查找路径的地方,你把 .so 所在的路径添加进去就行了。

这样,应该就能编译了。 不过实际执行的时候,可能还是会说找不到 xxx.so
因为编译虽然过了,但你只告诉了编译器而并没有告诉程序应该在哪里查找这个 .so
这里还需要再设置一下系统搜索连接库的路径。 添加上你的 .so 所在的路径。具体方法我不记得了,也是在一个帖子上找的....


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求助!关于c++编写和引用.so的问题,总是出错.
帖子发表于 : 2011-01-07 6:52 

注册: 2010-12-23 10:23
帖子: 120
送出感谢: 0 次
接收感谢: 4
看了下自己的命令行历史
是在 /etc/ld.so.conf 的末尾添加一行,填入你 .so 文件所在的绝对路径
然后在控制台 sudo ldconfig 就行了。

不过当时记得还有别的方法,你可以再搜索看看。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求助!关于c++编写和引用.so的问题,总是出错.
帖子发表于 : 2011-01-07 14:29 

注册: 2010-03-27 17:23
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
谢谢啊,我再看看。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译