我有一个有趣的鸡蛋问题和一个潜在的解决方案(请参阅我的帖子回答),但该解决方案以不寻常的方式使用CMake.欢迎更好的替代方案或评论.
问题:
该问题的简单版本可以描述为具有以下特征的单个CMake项目:
mycompdir中,并且无法对该目录的内容进行任何修改.foo.my和bar.my),需要mycomp运行它们以生成一组C++源代码和标题以及一些   CMakeLists.txt定义从这些源构建的库的文件.CMakeLists.txt文件定义的库.这些其他目标也有#include一些生成标题的源.您可以将mycomp视为类似编译器的内容,将第2步中的文本文件视为某种源文件.这提出了一个问题,因为CMake CMakeLists.txt在配置时需要文件,但mycomp在构建时间之前不可用,因此在第一次运行时不能及时创建CMakeLists.txt文件.
NON-解答:
通常情况下,基于ExternalProject的超级构建安排将是一个潜在的解决方案,但上面是我正在处理的实际项目的相当简化,我没有自由将构建分成不同的部分或执行其他大型规模重组工作.
我试图删除.txt文件但文件名存储在类型的变量中std::string.问题是,程序事先不知道文件的名称,所以我不能只使用remove("filename.txt");
string fileName2 = "loInt" + fileNumber + ".txt";
Run Code Online (Sandbox Code Playgroud)
基本上我想做的是:
remove(fileName2);
Run Code Online (Sandbox Code Playgroud)
但是,它告诉我,我不能使用它,因为它给了我错误:
没有合适的从"std :: string"到"const char*"的转换函数.
我正在使用 gcc 和 clang 尝试共享库中的符号可见性(就这个问题而言,两者似乎表现出相同的行为)。这个问题的动机是确保特定符号永远不会在共享库中暴露。想象一个具有敏感名称的函数,该名称必须保密,并且该函数在共享库内部使用。在 Linux 上一切都按照我的预期进行,但在 macOS 上我似乎无法确保符号确实完全隐藏。
我已将问题简化为以下最小演示程序。真实的场景会使用诸如-fvisibility等的标志,而不是显式地在每个符号上放置属性,但我这样做只是为了最小化示例(即不关注样式,只关注行为)。
足球俱乐部
__attribute__ ((visibility("default"))) int func(int v)
{
    return v + 14;
}
__attribute__ ((visibility("hidden"))) double some_other_func()
{
    return 1.23456;
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令行进行编译(针对 macOS 显示,用于libf.soLinux):
gcc -shared -fPIC -o libf.dylib f.c
Run Code Online (Sandbox Code Playgroud)
我希望该some_other_func()函数被隐藏,但使用nm我可以确认它仍然作为全局/外部符号出现在文本部分中(大写T而不是小写t,后者是可以删除的本地符号):
# macOS
> nm -DC lib.dylib
0000000000000f80 T func
0000000000000fa0 T some_other_func
                 U dyld_stub_binder
Run Code Online (Sandbox Code Playgroud)
但在 Linux 上,我们得到了我们所期望的结果,但some_other_func()没有出现:
# Linux
> nm -DC libf.so
0000000000201020 B __bss_start …Run Code Online (Sandbox Code Playgroud) 所以我用 Qt creator (C++11) 定义了这个类:
#ifndef CONTACT_H
#define CONTACT_H
#include <QStringList>
#include <list>
class Contact
{
public :
    Contact();
    ~Contact(); // destructeur
    Contact(const Contact & contact); // constructeur de copie
    Contact&  operator=(const  Contact& c); //opérateur de copie
    Contact( Contact && c); // constructeur de déplacement
    Contact&  operator=(Contact&& c); // opérateur de déplacement
    QString obtAdresse() const;
    void changeAdresse(QString adresse);
    QString obtFacebook() const;
    void changeFacebook(QString facebook);
    QString obtTwitter() const;
    void changeTwitter(QString twitter);
    QString obtNote() const;
    void changeNote(QString note);
    virtual  QString getnom() = …Run Code Online (Sandbox Code Playgroud)