我需要构建两个第三方共享库,因此其他项目将重用其.so文件.但是,在构建之后,这些库中的一个包含到另一个库的硬编码路径.此路径在其他计算机上无效并导致链接器警告.如何防止将完整路径嵌入到生成的.so文件中?
细节:
第一个库源:~/dev/A
第二个库源:~/dev/B
它们都有configure生成make文件的脚本.图书馆B取决于A.所以,首先我建立A:
$ ~/dev/A/configure --prefix=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)
然后我建立B:
$ ~/dev/B/configure --prefix=~/dev/B-install --with-A=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)
然后,我要上传的内容~/dev/A-install和~/dev/B-install我们的文件服务器,以便其他团队,并建立机可以使用的二进制文件.但是当他们尝试使用时,他们会收到链接器警告B:
/usr/bin/ld: warning: libA.so.2, needed by /.../deps/B/lib/libB.so, not found (try using -rpath or -rpath-link)
Run Code Online (Sandbox Code Playgroud)
当我运行ldd libB.so它时给出:
...
libA.so.2 => /home/alex/dev/A-install/lib/libA.so.2
Run Code Online (Sandbox Code Playgroud)
显然这条路径只存在于我的机器上,在其他机器上找不到.
如何从中删除完整的硬编码路径libB.so?
谢谢.
以下是具有常见错误的"范围锁定"习惯用法的示例:未创建局部变量,因此锁定无效.这段代码在VC++ 2010和Comeau C++在线编译完美无瑕:
class Mutex
{
public:
void lock() {}
};
class ScopedLock
{
public:
ScopedLock() : m_pm(0) {}
ScopedLock(Mutex& m) : m_pm(&m) { m_pm->lock(); }
private:
Mutex* m_pm;
private:
ScopedLock& operator =(const ScopedLock&);
ScopedLock(const ScopedLock&);
};
class X
{
public:
void foo() const
{
ScopedLock(m_mutex);
}
private:
Mutex m_mutex;
};
int main()
{
X x1;
x1.foo();
}
Run Code Online (Sandbox Code Playgroud)
如果注释掉ScopedLock的默认构造函数,则两个编译器都会给出错误:
错误C2512:'ScopedLock':没有合适的默认构造函数可用
(ScopedLock正确使用时,即创建局部变量:ScopedLock guard(m_mutex);,然后编译按预期失败.声明m_mutex为可变修复问题.)
我有两个问题:
为什么X::foo编译?似乎编译器能够const Mutex&以Mutex&某种方式进行转换.
什么角色扮演ScopedLock默认构造函数,所以编译成功了? …
我需要接受lambda函数作为参数并找出它的返回类型.到目前为止,我无法想出任何可行的方法.这是一个例子:
template <typename T1, typename T2>
T1 foo(T2 arg, std::function<T1(T2)> f)
{
return f(arg);
}
...
int n = foo(3, [](int a){ return a + 2; }); <-- ERROR!
Run Code Online (Sandbox Code Playgroud)
怎么做到呢?Boost解决方案也可以.
我有下表:
问候: + ------------------------- + | id | lang_id | 名称| + ------------------------- + | 1 | 1 | '你好!' | | 1 | 2 | '你好!' | | 1 | 3 | “萨鲁特!” | + ---- + --------- + ---------- +
我需要从中创建一个.CSV文件以进行后续处理:
greeting.csv: --------------------- id; en; es; fr 1;你好!;¡Hola!; Salut! ---------------------
我可以使用GROUP_CONCAT以下命令将所有语言连续选择:
SELECT
id,
GROUP_CONCAT(name SEPARATOR ';') as 'name'
FROM
greeting
WHERE
greeting.id = 1;
Run Code Online (Sandbox Code Playgroud)
它产生结果:
id | 名称 --- + -------------------- 1 | 您好!;¡Hola!; Salut!
但是,它需要对代码中的“名称”列进行特殊处理,因为在继续之前,我必须对连接的字符串进行标记化。 …