我对make和autotools(我还没有用于这个项目)的知识充其量是最基本的,尽管在很长一段时间内进行了大量的谷歌搜索和实验.我有一个像下面这样的源层次结构,我正试图找到尽可能无缝的构建方式.
该应用程序由一个主应用程序组成,其中包含app/src下各种子文件夹中的源代码.这些是使用该文件夹的根目录中的相应Makefile构建的.
然后我有多个其他实用程序驻留在app/tools下的不同文件夹,每个文件夹都有自己的Makefile.
app/src/module1/file1.cpp
app/src/module1/file1.hpp
app/src/module2/file2.cpp
app/src/module2/file2.hpp
app/src/module3/file3.cpp
app/src/module3/file3.hpp
app/src/main.cpp
app/src/main.hpp
app/src/Makefile
app/tools/util1/file1.cpp
app/tools/util1/file1.hpp
app/tools/util1/Makefile
app/tools/util2/file2.cpp
app/tools/util2/file2.hpp
app/tools/util2/Makefile
Run Code Online (Sandbox Code Playgroud)
对我来说问题是,其中一些工具依赖于app/src源文件夹中的源文件,但启用了预处理宏EXTERNAL_TOOL.因此,编译主应用程序和varous实用程序生成的目标文件不兼容.
目前要构建项目的每个部分,我必须清理它们之间的源树.这很痛苦,当然不是我想要的.解决这个问题的最佳方法是什么?我所拥有的那些我无法付诸实践的想法是:
我不太确定我有时间和耐心需要掌握make/autotools.可能其他一个构建工具(scons?cmake?)使这种任务更容易实现?如果是这样的话?
更新:这就是我现在所拥有的
SOURCES := util1.cpp util2.cpp util3.cpp \
../../src/module1/file1.cpp \
../../src/module1/file2.cpp \
../../src/module1/file3.cpp \
../../src/module2/file4.cpp \
../../src/module3/file5.cpp \
../../src/module3/file6.cpp \
../../src/module4/file7.cpp \
../../src/module4/file8.cpp \
../../src/module3/file9.cpp \
../../src/module4/file10.cpp \
../../src/module5/file11.cpp \
../../src/module3/file12.cpp \
../../src/module1/file13.cpp \
../../src/module3/file14.cpp \
../../src/module3/file15.cpp
OBJECTS = $(join $(addsuffix .util/, $(dir $(SOURCES))), $(notdir $(SOURCES:.cpp=.o)))
.PHONY: all mkdir
all: util
util: $(OBJECTS) …Run Code Online (Sandbox Code Playgroud) 使用以下方法在TCL中创建列表之间存在以下差异:
[list a b c]
Run Code Online (Sandbox Code Playgroud)
VS
{a b c}
Run Code Online (Sandbox Code Playgroud)
我绝不是一个经验丰富的TCL程序员,但到目前为止我遇到的唯一区别是当创建多行的列表时,第一种样式需要使用行继续符,如:
[list \
a \
b \
c \
]
Run Code Online (Sandbox Code Playgroud)
这解析得很好:
{
a
b
c
}
Run Code Online (Sandbox Code Playgroud)
还有其他差异吗?哪个被认为是更好的风格或惯用?
看来,在创建具有嵌套列表的复杂列表时,第二种样式是唯一干净的方法.
我正在设计一个多线程c ++服务器应用程序,它在自己的线程中为客户端提供服务,还有各种其他工作线程来执行其他任务.
所有这些线程都依赖于单个文本配置文件,该文件需要能够在不退出并重新启动进程的情况下重新进行.
我目前正在考虑让每个客户端和工作线程拥有它自己的配置对象副本,然后在每次重新散列时都有这个更新.
我发现这一点的一件事是将配置传递给我更喜欢的所有其他实用功能,并且不认为应该是上述类的一部分看起来非常单调乏味.
除了对大量同步的痛苦需求之外,拥有全局配置会更加容易.
打开任何关于如何在线程应用程序中解决非常量全局配置的想法!
c++ configuration multithreading global-variables thread-safety
使用字符串流对字符串进行十六进制编码很容易,但是可以反向并使用字符串流解码生成的字符串吗?
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
int main()
{
std::string test = "hello, world";
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (unsigned ch : test)
ss << std::setw(2) << int(ch);
std::cout << ss.str() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我不打算直接移位字节或使用旧的c函数,例如scanf系列函数.
阅读C++源代码显然是一种很好的学习方式,当它是一个你很少了解的特性时,它就显得非常有趣.就标准库来源而言,由于名称的丑化,这很难实现.
在将源代码包含在标准库中之前,是否通过某种类型的源代码处理完成了uglifying?如果是这样,原始源代码会发生什么?是否有任何非uglified C++标准库源代码的存储库?
我在寻找有趣的C++ 11很快C++ 14种特别功能.
我无法想象保持这种形式的代码会非常有趣....
编辑:
有人建议在这里取消这个过程.
为什么使用is_it_valid_color("yellow")工作和输出FOUND IT但使用is_it_valid_color(x.c_str());不起作用?
我有一种感觉它与null终止字符串有关.控制台中的输出看起来相同:
color: 'yellow'
FOUND IT
color: 'yellow'
Run Code Online (Sandbox Code Playgroud)
.
const char *color_names[] = {"yellow", "green", "red"};
const int color_names_SIZE = 3;
void is_it_valid_color(const char* color) {
cout << "color: '" << color << "'" << endl;
for(int i = 0; i < color_names_SIZE; ++i) {
if(color == *(color_names + i)) {
cout << "FOUND IT" << endl;
break;
}
}
}
is_it_valid_color("yellow");
string x = "yellow";
is_it_valid_color(x.c_str());
Run Code Online (Sandbox Code Playgroud)