当前位置:  技术问答>linux和unix

g++编译动态联接库及调用(源码)

    来源: 互联网  发布时间:2015-10-01

    本文导语:  我想在QT下调用自己的.so //test.h #ifndef __TEST_H #define __TEST_H //这是在C++程序中声明标准C方式联接的方法  #ifdef __cplusplus extern "C"  { #endif #ifdef SHARED int ( *getValue)( int a); #else  int getValue( int a); #endif #ifdef __cpl...

我想在QT下调用自己的.so

//test.h
#ifndef __TEST_H
#define __TEST_H
//这是在C++程序中声明标准C方式联接的方法 
#ifdef __cplusplus
extern "C" 
{
#endif

#ifdef SHARED
int ( *getValue)( int a);
#else 
int getValue( int a);
#endif

#ifdef __cplusplus
}
#endif

//test.cpp
/* test.cpp */


#include "test.h"

int getValue( int a)
{
 return a;
}

command:
g++ -g -c -fPIC -o test.o test.cpp

ok!
 g++ -g -shared -Wl -o my.so test.o -lc

OK!

/****main.cpp***/
#include 
#include /* 包含动态链接功能接口文件 */
#define SOFILE "./my.so" /* 指定动态链接库名称 */
#define SHARED
#include"test.h"
main()
{

 void *dp;
 char *error;
// int (*getValue a);
 
 dp=dlopen(SOFILE,RTLD_LAZY); /* 打开动态链接库 */
 if (dp==0) /* 若打开失败则退出 */
 {
  fputs(dlerror(),stderr);  
 } 
 getValue=dlsym(dp,"getValue");
 error=dlerror(); /* 检测错误 */
 if (error) /* 若出错则退出 */
 {
  fputs(error,stderr);
 
 } 
 int b = getValue( 100 ); /* 调用此共享函数 */
 printf( "the result is: %dn", b);
 dlclose(dp); /* 关闭共享库 */
 return 1; /* 成功返回 */



[root@localhost rain_dll]# g++ -g -o dy dy.cpp -ldl
In file included from /usr/include/c++/3.2.2/backward/iostream.h:31,
                 from dy.cpp:1:
/usr/include/c++/3.2.2/backward/backward_warning.h:32:2: warning: #warning This
file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples
include substituting the  header for the  header for C++ includes, or  instead of the deprecated header . To disable this warning
use -Wno-deprecated.
dy.cpp: In function `int main()':
dy.cpp:20: invalid conversion from `void*' to `int (*)(int)'

???????????????????invalid conversion from `void*' to `int (*)(int)'????????????????



|
包涵头文件不是c++标准 多个warning

main前面加上 int

    
 
 

您可能感兴趣的文章:

  • g++编译联接都通过,运行却提示"段错误",怎么回事?
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 我c调用b.so,b调用a.so编译能通过,运行时找不到库怎么办啊?????
  • 初学jsp,一个html调用一个jsp,这个jsp调用一个javaBean,已编译成类,最后如何部署(用j2sdkee)?
  • g++能调用gcc编译出来的库中的函数吗?
  • 有谁知道怎样设置tomcat4.03 当重新编译servlet后不用重起便能调用最新编译的servlet.
  • 提问:有关SQC的编译与c程序的调用
  • 急!请问大虾,如何书写UNXI下的MakeFile以编译C(调用了某些库)程序?
  • linux中使用codeblocks编译C++程序debug可以执行和Release调用出错
  • 如何在程序中动态的加载并且调用另一个编译好的函数?
  • 交叉编译系统调用模块错误
  • 新手的菜鸟问题:不同内核版本下编译的程序能否互相调用,是否需要在同一内核下重新编译.
  • RedHat Linux 下怎么调用gcc 行编译器?
  • linux下c++调用数学函数后,编译正确但不出结果
  • 请教:修改Linux内核时,需要调用驱动程序的函数,头文件也包含了,但是编译时候说头文件找不到!
  • 一个lib里调用了另一个lib的内容,应用程序编译通不过
  • 编译好的javaBean的.class文件怎样部署到tomcat服务器中,让jsp调用?
  • 基于thinking in java 书中例题的编译 因为作者调用了自己的类
  • undefined reference: 编译时不知道要调用哪个类库
  • sco上调用syslog()编译出错???
  • G++ 4.4.2和linux编译调用模板的函数,编译不通过,但是VC2005却可以。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 编译GCC时能不能只编译C/C++的编译器?
  • 高速的网络抓包库PF_ring介绍及编译安装
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • 问:关于gcc编译器和g++编译器
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 在cygwin编译驱动程序要不要交叉编译?
  • 关于如何把编译进内核的编译成模块
  • C编译器 c++编译器 wieldylcc
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题 iis7站长之家
  • 编译失败后如何再继续编译
  • 编译qt-x11,最后编译生成可执行文件时候,make出错
  • 如何查看已编译安装软件的编译命令行
  • 请问哪里有反编译.class文件的反编译器?
  • 用Jdk编译时出现提示要加 -deprecation 再编译,请教??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3