【问题标题】:Access pre-compiled functions within a class C++/11访问 C++/11 类中的预编译函数
【发布时间】:2014-08-23 09:53:09
【问题描述】:

抱歉,如果标题具有误导性,我目前正在寻找以下解决方案:

我正在开发一个库,供其他人使用。他们必须遵循严格的设计理念以及他们在库中构建任何附加功能的方式。他们都使用 Linux 和(Vim),因此允许使用终端命令(即能够编译等),我们都使用 clang 作为编译器。

我的问题是这样的:假设我编写了一个名为:“checkCode”的函数:

    template<typename T>
    void checkCode(T&& codeSnippet)
    {
       //// code 
    }

我想让这个函数运行,所以每当他们在终端中输入“checkCode”时,这个函数就会被调用。我知道使用 clang 你有类似的功能,但是,这是可以理解的,因为你使用的是整个 clang。所以:

1) 是否可以只编译一个类,然后通过 .dylab | .so 文件?

2) 可能是一个更好的主意,或者,最好复制一份 clang 的源代码,添加这个功能并将其分配给那些使用和贡献该库的人?这就像是 clang 的附加组件?

谢谢

【问题讨论】:

  • 这不正是动态库的目的吗?
  • 如果您希望能够从命令行运行程序,您需要创建一个可执行文件。因此,您需要一个名为main 的函数,并且生成的可执行clang(在您为-o 参数指定的名称下)将执行main 中定义的操作。如果main 调用checkCode,那么程序就会这样做。无法通过在命令行中输入函数名来直接运行库中定义的函数。
  • 我不太确定,但你是要unit testing framework吗?
  • checkCode 不是函数,不会在目标文件或库中留下任何痕迹。假设您知道如何克服这个问题,您想传递什么样的参数以及如何从命令行输入它?在任何情况下,您可能都不想分叉。你可能想为你的库提供 python 接口。
  • @n.m.嘿,谢谢你的回复。理想情况下,我想 fork clang 并对此进行补充,以便能够学习,并希望为开源项目做出贡献。你对此有何看法?我知道还有其他任务要做,这可能已经实现了

标签: c++ shell clang


【解决方案1】:

你可以像busybox一样使用一个可执行文件和符号链接:

int main(int argc, char **argv)
{
    string programName = argv[0];
    size_t lastSlash = programName.find_last_of('/');
    if(lastSlash != string::npos)
        programName = programName.substr(lastSlash + 1);
    if(programName == "function_1")
    {
        function_1();
        return 0;
    }
    if(programName == "function_2")
    {
        function_2();
        return 0;
    }
    // ...
    // normal main code
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2013-02-14
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多