DEBEG记录--001(调试core文件发现vfprintf()出错,制作动态库时的模板函数的使用注意点)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 04:09   20   0

1.多次用printf打印线程ID可能会导致栈溢出,从而导致产生段错误。

2.在C++中如果在制作含有模板函数的动态库时,一定要注意模板函数的声明和实现要放在一个文件中,建议最好在一个hpp文件中,否则即使动态链接动态库的时候没有出错,在执行的时候会报找不到定义的那个模板函数的错。

文件1-mutenTool.cpp

#include "mutenTool.hpp"
using namespace std;
void fun()
{
        long s = 0;
        for(int i = 0;i<200000000;i++)
        {
          s+= i;
        }
        cout << s<< endl;

}

文件2-mutenTool.hpp

#ifndef __TOOL__
#define __TOOL__
#include <iostream>
using namespace std;
template<class T>
void measure(T&& func)
{
        using namespace std::chrono;
        auto start = system_clock::now();
        func();
        duration<double> diff = system_clock::now()-start;
        cout<<"eclapsed:"<< diff.count() << "seconds"<< endl;
}
void fun();
#endif

文件3-main.cpp

#include <iostream>
#include "mutenTool.hpp"
int main()
{
        measure(fun);
        return 0;

}

文件1和文件2生成动态库:

g++  -shared -o libmutenTool.so mutenTool.cpp  -std=c++11 -fPIC

文件三调用动态库:

g++ -o main main.cpp -L/home/muten/C/utility -lmutenTool -std=c++11

动态库调用的时候要注意-L后面的要根据自己的目录灵活调整。

上面的代码是可以正常运行的,但是如果将mutenTool.hpp中的函数模板分开声明定义,则在调用的时候会出现链接不到的问题,可测试一下。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP