zoukankan      html  css  js  c++  java
  • SytemC on CentOS 5.3 64bit

    系统环境

    • CentOS 5.3 64bit
    • gcc 4.1
    • SystemC 2.2

    操作目的

    • 将SystemC模块编译为.so由外部程序调用

    出现故障

    • 编译的时候gcc显示需要将libsystemc.a使用-fPIC开关进行编译,同时显示模块找不到符号。

    故障原因

    • 为了将SystemC模块打入.so需要将libsystemc.a编译为PIC代码。gcc4默认情况下不再启用-fPIC开关。

    解决方法

    • 打开configure.in文件,在针对Linux x86_64平台下的-Wall开关后面加上-fPIC。执行config目录下的distinstall和boostrap脚本生成新的配置。然后正常./configure、make、make install、make clean。

    实战演练

    • 声明一个名字叫做Trust的.so,然后在外部程序中执行这个.so(其实就是手动执行.so中的函数)。两个文件代码如下。
    代码
    #include <iostream>
    #include 
    <systemc.h>

    using namespace std;

    SC_MODULE(first_counter)
    {
        SC_CTOR(first_counter){
            cout
    <<"Trust"<<endl;
        }
    };

    int sc_main(int argc, char* argv[])
    {
        cout
    <<"sc_main running!"<<endl;
        
    for(int i=0; i<argc; ++i)
        {
            cout
    <<'\t'<<argv[i]<<endl;
        }
        first_counter c1(
    "c1");
        
    return 0;
    }


    #define EXPORT __attribute__((visibility("default")))

    extern "C"
    {
        EXPORT
        
    void Fork(int n, int m)
        {
            
    char** argv = (char**)malloc(sizeof(void*)*2);

            
    char buf[256];

            sprintf(buf,
    "%d",n);
            argv[
    0= strdup(buf);

            sprintf(buf,
    "%d",m);
            argv[
    1= strdup(buf);

            sc_main(
    2,argv);
            
            free(argv[
    0]);
            free(argv[
    1]);
            free(argv);
        }
    }




    代码
    #include <dlfcn.h>
    #include 
    <iostream>

    using namespace std;

    typedef 
    void (*PFNVOIDINT)(int,int);

    int main(int argc, char* argv[])
    {
        
    void* Handle = dlopen("/home/Bo/Projects/Trust/libTrust.so",RTLD_LAZY);

        PFNVOIDINT ForkFunc 
    = (PFNVOIDINT)dlsym(Handle,"Fork");

        
    if( ForkFunc )
            ForkFunc(
    1234567890,1122334455);

        dlclose(Handle);
        
    return 0;
    }

    执行结果完全正常,参数正确传入SystemC的模块.so内。

  • 相关阅读:
    玩转java多线程(wait和notifyAll的正确使用姿势)
    shell脚本编写之Hello World
    面试题录:数据库篇
    面试题录:笔试题篇
    浅谈String、StringBuffer与StringBuilder
    Java攻城狮面试题录:笔试篇(1)
    Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
    TensorFlow从1到2(十五)(完结)在浏览器做机器学习
    TensorFlow从1到2(十四)评估器的使用和泰坦尼克号乘客分析
    TensorFlow从1到2(十二)生成对抗网络GAN和图片自动生成
  • 原文地址:https://www.cnblogs.com/Jedimaster/p/1653034.html
Copyright © 2011-2022 走看看