看看世界上最好用的C、C++ IDE

我在网上看了一些关于.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] 键关闭终端...

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

作者: jinyue524   发布时间: 2011-01-06

我今天也在试怎么用链接库,哈哈。
不过我使用的 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 所在的路径。具体方法我不记得了,也是在一个帖子上找的....

作者: pengqian   发布时间: 2011-01-07

看了下自己的命令行历史
是在 /etc/ld.so.conf 的末尾添加一行,填入你 .so 文件所在的绝对路径
然后在控制台 sudo ldconfig 就行了。

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

作者: pengqian   发布时间: 2011-01-07

我在网上看了一些关于.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] 键关闭终端...

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

作者: jinyue524   发布时间: 2011-01-06

我今天也在试怎么用链接库,哈哈。
不过我使用的 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 所在的路径。具体方法我不记得了,也是在一个帖子上找的....

作者: pengqian   发布时间: 2011-01-07

看了下自己的命令行历史
是在 /etc/ld.so.conf 的末尾添加一行,填入你 .so 文件所在的绝对路径
然后在控制台 sudo ldconfig 就行了。

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

作者: pengqian   发布时间: 2011-01-07

我在网上看了一些关于.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] 键关闭终端...

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

作者: jinyue524   发布时间: 2011-01-06

我今天也在试怎么用链接库,哈哈。
不过我使用的 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 所在的路径。具体方法我不记得了,也是在一个帖子上找的....

作者: pengqian   发布时间: 2011-01-07

看了下自己的命令行历史
是在 /etc/ld.so.conf 的末尾添加一行,填入你 .so 文件所在的绝对路径
然后在控制台 sudo ldconfig 就行了。

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

作者: pengqian   发布时间: 2011-01-07