小编Ale*_*man的帖子

如何在没有硬编码完整依赖路径的情况下构建共享库(.so)?

我需要构建两个第三方共享库,因此其他项目将重用其.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

谢谢.

c++ linker gcc shared-libraries

17
推荐指数
1
解决办法
1万
查看次数

使用临时实例的const正确性

以下是具有常见错误的"范围锁定"习惯用法的示例:未创建局部变量,因此锁定无效.这段代码在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为可变修复问题.)

我有两个问题:

  1. 为什么X::foo编译?似乎编译器能够const Mutex&Mutex&某种方式进行转换.

  2. 什么角色扮演ScopedLock默认构造函数,所以编译成功了? …

c++

6
推荐指数
1
解决办法
293
查看次数

接受lambda作为函数参数并提取返回类型

我需要接受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解决方案也可以.

c++ lambda templates c++11

2
推荐指数
2
解决办法
509
查看次数

如何在没有GROUP_CONCAT的情况下将行转换为列?

我有下表:

问候:
+ ------------------------- +
| 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!

但是,它需要对代码中的“名称”列进行特殊处理,因为在继续之前,我必须对连接的字符串进行标记化。 …

mysql sql

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

标签 统计

c++ ×3

c++11 ×1

gcc ×1

lambda ×1

linker ×1

mysql ×1

shared-libraries ×1

sql ×1

templates ×1