小编gim*_*ilk的帖子

cmake:读取和编译动态生成的cpp文件列表

我有一个自定义工具,该工具处理给定IDL文件列表并生成许多.cpp和.h文件作为输出。我想将这些文件添加到要在我的CMakeLists中进行编译的事物列表中,并且还要对这些文件对IDL的依赖关系进行建模。为简单起见,我声明对任何IDL文件的任何更改都应触发所有cpp / h的重新生成。

我有一个自定义命令,负责运行生成器工具并列出所有IDL文件作为依赖项。

我的问题是在构建时将后续的cpp / h文件列表放入cmake。无法从IDL文件的名称推断出将生成哪些cpp文件。但是,我的生成器工具会将生成的文件列表输出到文本文件。

所以我的问题是:我如何指示cmake“从此文本文件中读取内容并将其添加为要编译的额外源文件和头文件”,还要记住,所述文本文件仅在构建的某个阶段存在?

c++ idl cmake

5
推荐指数
1
解决办法
1208
查看次数

gdb暂时给页面写入权限吗?

我正在调试一个Linux应用程序中的seg错误,该错误是由程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到一个页面中,然后读取 - 唯一的许可).

在GDB中,我在汇编程序中放置了一个断点,它执行了坏存储,当它停在那里时,我使用GDB手动执行了等效的写操作.GDB在没有任何投诉的情况下做到了这一点,并且阅读价值证明它确实已经写好了.我查看了/ proc/thepid/maps,并且该特定页面仍被标记为"不可写".

所以我的问题是:GDB是否暂时在只读页面上设置写权限,执行写操作,然后重置权限?谢谢.

linux permissions gdb

4
推荐指数
1
解决办法
790
查看次数

使用ffmpeg(或类似)打印详细的h264信息

我在mpeg传输流中有一些h264视频,我怀疑在视频中的某些点它从1080i/50Hz切换到1080p/25Hz.我想证明使用一些视频分析工具.ffmpeg(或类似的)可以打印出这样详细的解码信息吗?我已经尝试了ffmpeg设置"-loglevel debug",但它不再打印有关实际解码的信息.

ffmpeg analysis h.264

4
推荐指数
1
解决办法
4322
查看次数

C++ 临时字符串的生存期

抱歉,我知道存在类似的问题,但我仍然不完全清楚。以下安全吗?

void copyStr(const char* s)
{
    strcpy(otherVar, s);
}

std::string getStr()
{
    return "foo";
}

main()
{
    copyStr(getStr().c_str());
}
Run Code Online (Sandbox Code Playgroud)

临时 std::string 将存储 getStr() 的返回值,但它的寿命是否足以让我将其 C 字符串复制到其他地方?或者我必须明确地为其保留一个变量,例如

std::string temp = getStr();
copyStr(temp.c_str());
Run Code Online (Sandbox Code Playgroud)

c++ string temporary

4
推荐指数
1
解决办法
4982
查看次数

cmake:检查文件是否在构建时存在,而不是在cmake配置期间

我有一个自定义生成命令,需要检查是否存在某个文件.我试过用

IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()
Run Code Online (Sandbox Code Playgroud)

但该测试仅评估一个; 当cmake第一次运行时.每次制作完成后我都需要它来执行测试.什么是在制作时检查的方法?谢谢.

file exists cmake

3
推荐指数
1
解决办法
5611
查看次数

C++:从可变参数模板创建自定义函数调度程序

我有一些从序列化数据中读取各种类型的函数,例如:

class DataDeserializer
{
    int getInt();
    std::string getString();
    MyClass getMyClass();
}
Run Code Online (Sandbox Code Playgroud)

然后我有各种带有任意参数的回调函数,例如:

void callbackA (int, int, int);
void callbackB (int, std::string);
void callbackC (std::string, int, MyClass, int);
Run Code Online (Sandbox Code Playgroud)

我想调用从反序列化数据流中读取的参数的各种回调.我想要的是尽可能自动化样板代码.我想也许我可以使用模板.如果我有某种Dispatcher类,例如:

template <SOMETHING??> class Dispatcher
{
    void dispatch()
    {
        // ???? 
    }

    SOMEFUNCTIONTYPE callback;
    DataDeserializer myDeserializer;
};
Run Code Online (Sandbox Code Playgroud)

然后声明各种特定的调度员:

Dispatcher<int,int,int>                  myDispatcherA (deserializer, callbackA);
Dispatcher<int,std::string>              myDispatcherB (deserializer, callbackB);
Dispatcher<std::string,int,MyClass,int>  myDispatcherC (deserializer, callbackC);
Run Code Online (Sandbox Code Playgroud)

然后,当我想发送时,我只是打电话给:

myDispatcherB.dispatch();
Run Code Online (Sandbox Code Playgroud)

下面会扩展到这样的东西:

void dispatch()
{
    callback (myDeserializer.getString(), myDeserializer.getInt(), myDeserializer.getMyClass(), myDeserializer.getInt());
}
Run Code Online (Sandbox Code Playgroud)

这可能与C++ 11可变参数模板有关吗?我已经阅读了一些关于它们的内容,似乎递归使用了很多.

c++ templates variadic

3
推荐指数
1
解决办法
1567
查看次数

标签 统计

c++ ×3

cmake ×2

analysis ×1

exists ×1

ffmpeg ×1

file ×1

gdb ×1

h.264 ×1

idl ×1

linux ×1

permissions ×1

string ×1

templates ×1

temporary ×1

variadic ×1