当我使用Visual Studio 2012时,使用自动链接,我不需要手动添加boost/POCO/python库,它们会自动添加.如果我错过任何图书馆,我会得到这样的信息:
链接:致命错误LNK1104:无法打开文件'libboost_system-vc110-mt-1_55.lib'
但它如何知道我想要链接哪个文件?也许我想动态链接,使用boost_system-vs110-mt-1_55.lib,或者我想在名称中使用gd或sgd?
它是如何做出选择的?
问题是,我的程序正在寻找libboost_ ...(即静态)库,当搜索系统,线程等时,但它想要python的boost_(即动态),我只是不明白为什么?
我在库中有这个方法:
#include <stdexcept>
mytype* myfunc()
{
throw std::runtime_error("is uncatchable");
}
Run Code Online (Sandbox Code Playgroud)
这是int main()链接库的可执行过程.
try { myfunc(); }
catch(std::exception const& ex) { std::cout << "handled: " << ex.what() << std::endl; }
catch(...) { std::cout << "something else..." << std::endl; }
Run Code Online (Sandbox Code Playgroud)
这是输出:
terminate called after throwing an instance of 'std::runtime_error'
what(): is uncatchable
Abort (core dumped)
Run Code Online (Sandbox Code Playgroud)
问题:为什么异常没有被捕获?
我不管理我的编译器标志(icc-11.X),OS也不在我的控制之下.
编译器标志列表:
-DLINUX -DLINUX_X64 -DGNU_SOURCE -fPIC -Wcheck -Wshadow -Wdeprecated -Wreturn-type -Wcomment -Wmissing-prototypes -Wp64 -Drcsid="__attribute__((used)) rcsid"
-D__EXTENSIONS__ -D__STD_C__ -D_XOPEN_SOURCE=500 -D_GNU_SOURCE -DNDEBUG
Run Code Online (Sandbox Code Playgroud)
__EXCEPTIONS 被定义为.
可能存在导致这种情况的Linux设置吗?
可能存在导致这种情况的编译器设置吗?
在任何地方都写出如果存在具有相关静态变量的不同编译单元,则会出现问题.如果一个编译单元中存在静态变量,则应该没有问题:它们将按照它们在文件中的位置的顺序进行初始化.
但我有这个代码:
template <typename T>
class A{
public:
int _data;
T _obj;
A(int data) :_data(data){}
};
template <typename T>
class B{
public:
const static B<T> nullObj;
B(int data) :_a(new A<T>(data)){}
A<T> *_a;
};
template <typename T>
class C{
public:
const static C<T> nullObj;
C() :_a(nullObj._a){}
C(bool t) :_a(B<T>::nullObj._a){
_a->_data++; //FAILS HERE!
}
A<T> *_a;
};
template <typename T>
const B<T> B<T>::nullObj(0);
template <typename T>
const C<T> C<T>::nullObj(false);
class _B{};
class _A{ public: _A(){}; C<_B> g; }; …Run Code Online (Sandbox Code Playgroud) 我找不到信息,如何使用命名空间解析我的 XML:
我有这个xml:
<par:Request xmlns:par="http://somewhere.net/actual">
<par:actual>blabla</par:actual>
<par:documentType>string</par:documentType>
</par:Request>
Run Code Online (Sandbox Code Playgroud)
并试图解析它:
dom = ET.parse(u'C:\\filepath\\1.xml')
rootxml = dom.getroot()
for subtag in rootxml.xpath(u'//par:actual'):
#do something
print(subtag)
Run Code Online (Sandbox Code Playgroud)
并且得到了异常,因为它不知道命名空间前缀。有没有最好的方法来解决这个问题,计算那个脚本不会知道它要解析的文件和标签要搜索的文件?
搜索网络和 stackoverflow 我发现,如果我会在那里添加:
namespace = {u'par': u"http://somewhere.net/actual"}
for subtag in rootxml.xpath(u'//par:actual', namespaces=namespace):
#do something
print(subtag)
Run Code Online (Sandbox Code Playgroud)
那个有效。完美的。但是我不知道我将解析哪个 XML,并且//par:actual我的脚本也不知道搜索标记(例如)。所以,我需要找到从 XML 中提取命名空间的方法。
找了很多方法,如何提取namespace URI,比如:
print(rootxml.tag)
print(rootxml.xpath('namespace-uri(.)'))
print(rootxml.xpath('namespace-uri(/*)'))
Run Code Online (Sandbox Code Playgroud)
但是我应该如何提取前缀来创建 ElementTree 想要的字典?我不想在 xml 正文上使用正则表达式怪物来提取前缀,我相信必须存在支持的方式,不是吗?
也许必须存在一些方法让我通过 ETree 命名空间从 XML 中提取作为字典(如 ETree 想要的!)而无需手动操作?
我有父进程,必须创建几个子进程.我发现最好的方法是使用fork+ execl.但是父进程需要知道execl具体的孩子是否失败,我不知道如何实现.
int pid = fork();
if (pid < 0) {
std::cout << "ERROR on fork." << std::endl;
} if (pid == 0) {
execl("/my/program/full/path", (char *)NULL);
exit(1);
}
else {
if (/*child's process execl fails*/) {
std::cout << "it failed" << std::endl
} else {
std::cout << "child born" << std::endl
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这个想法并不好:
int status(0);
sleep(100);
int res = waitpid(pid, &status, WNOHANG);
if (res < 0 && errno == 10) {
std::cout << …Run Code Online (Sandbox Code Playgroud) 如何在Windows上运行pip?
我理解,这可能是一个非常愚蠢的问题,但所有指南,整个网络都有相同的:
$ pip install <package>
Run Code Online (Sandbox Code Playgroud)
但我应该在哪里找到这个"$"?它不是Windows控制台.它不是Python控制台.它们的组合并不相同.我应该在Windows上哪里找到这个神奇的"$"?
我有脚本:
moving1.py:
def move():
print("walk!")
Run Code Online (Sandbox Code Playgroud)
moving2.py:
def move():
print("run!")
Run Code Online (Sandbox Code Playgroud)
而man.py,可以通过参数move1或moving2脚本来接受.
man.py:
import sys
if len(sys.argv) <= 1:
exit("Too less arguments calling script")
__import__(sys.argv[1])
moving = sys.modules[sys.argv[1]]
def move():
moving.move()
Run Code Online (Sandbox Code Playgroud)
现在我有testman.py脚本,必须测试man.py执行的所有变体:
testman.py
import man #and somehow add here as argument "moving1"
man.move()
import man #and somehow add here as argument "moving2"
man.move()
Run Code Online (Sandbox Code Playgroud)
存在许多类似的问题,但它们并不完全符合我的要求.如何为导入的脚本添加参数?问题不是检查
if __name__ = "__main__":
Run Code Online (Sandbox Code Playgroud)
在那里,问题是使用我想要的参数完全导入脚本.可能吗?
我使用库"suds"与SOAP服务器进行通信.请求成功完成后,我收到回答:
answer = client.invoke('RetrieveBLABLAObject', modelthings)
Run Code Online (Sandbox Code Playgroud)
这个答案是所请求对象的许多不同领域的结构.每个字段都是由"字符串"参数"_type"和参数"value"组成的结构,它们可以具有不同的类型.
answer [key] [value] - 返回参数"value"的值.但是在调试模式下(我使用Python 2.7.6和PyCharm),它告诉我该值的类型为"Text".不是"str",不是"unicode",而是"Text".
如果我检查一下
isinstance(obj[cur_key]['value'], unicode)
Run Code Online (Sandbox Code Playgroud)
它告诉我,它将此文本视为"unicode".但是,如果我将它与具有相同主体的unicode进行比较,则返回false:
if obj[cur_key]['value'] != u'String that I know is there':
print("true") #it is printing, but it shouldn't
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何将"Text"转换为unicode?我试过了
obj[cur_key]['value'].decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
它除外.我该如何处理这种"文字"类型?
我得到了相当旧的代码,存在这样的天延迟计算:
#define _SECOND ((ULONGLONG) 10000000)
#define _MINUTE (60 * _SECOND)
#define _HOUR (60 * _MINUTE)
#define _DAY (24 * _HOUR)
FILETIME CurTime;
GetSystemTimeAsFileTime(&CurTime);
ULONGLONG qwCurResult = (((ULONGLONG)CurTime.dwHighDateTime) << 32) + CurTime.dwLowDateTime;
DWORD days = (qwCurResult - SomeULONGLONGMoment) / _DAY;
Run Code Online (Sandbox Code Playgroud)
当然我收到消息
warning C4244: 'argument' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data
Run Code Online (Sandbox Code Playgroud)
在现代VS2013编译器.我知道,这将是可以在DWORD中存储的两个时刻之间的完整天数.如何避免这条消息?
我不想用这个号码禁用所有警告,因为在其他地方它们可能非常有用.是否存在避免可能的数据丢失的正确方法?除了DWORD之外,我无法计算任何类型的天数(或者我只会将带有此警告的地方移动到代码的其他部分).
如果你认为这是不可避免的,最好的解决方案是使用另一种获取当前日期的机制 - 我将能够使用它,只要有方法将SomeULONGLONGMoment(即ULONGLONG)转换为它使用的类型.
我发现模板专业化存在很奇怪的问题。
这里:C++ 模板专业化
据记载,成员函数模板特化必须在类之外,但在相同的命名空间中(是的,如果模板特化在类内部,gcc 4.1.x 版本会失败并出现错误)。
因此,如果我将成员函数模板专业化移动到类下面的同一命名空间中,那么 msvc-2010 编译器会认为我定义了它两次:我有编译器错误:
错误LNK1169:找到一个或多个多重定义的符号
错误LNK2005及其定义两次的详细描述。
如果我将同一命名空间下的模板专业化移动到cpp文件中,则 msvc-2010 看不到它,并且在尝试对专用参数使用默认模板函数时会失败并出现多个错误:
错误 C2678:二进制“>>”:找不到采用“std::istringstream”类型的左侧操作数的运算符(或者没有可接受的转换)
(发生错误是因为它尝试调用运算符 >> 到 const char 指针)
因此,当模板专门化位于类内部时,msvc-2010 对我有用,但 gcc-4.1.x 不起作用。
最后,我应该在哪里放置模板专门化,以便能够在两个编译器中编译它?
那是标题:
#include <iostream>
#include <sstream>
#include <string>
class MyMap
{
public:
template<typename T>
T getValue(std::string phrase, T def)
{
std::istringstream ss(phrase);
T ret;
ss >> ret;
if(ss.fail() || !ss.eof())
return def;
else
return ret;
}
Run Code Online (Sandbox Code Playgroud)
而这个专业化(来自cpp,但我不知道它必须在哪里):
template<>
std::string MyMap::getValue(std::string phrase, std::string def)
{
return …Run Code Online (Sandbox Code Playgroud) 我有进程,运行多次子进程(每个没有GUI),并且需要为任务管理器设置所有子进程不同的"名称"和"描述".是否可以使用Win API?我找不到Windows系列的解决方案.
我期待WriteProcessMemory,但它看起来像作弊的形式,即使有可能改变名称.复制.exe文件的解决方案,运行它,并在处理完成后删除它 - 更是作弊.可能存在使用内存中的启动过程的解决方案(因此,我将exe文件加载到内存中,然后从那里启动它),但它也看起来很糟糕,我不确定我是否能够更改名称.
我希望有必要解决方案将进程名称设置为我自己的子进程,不是吗?