小编Fre*_*ner的帖子

强制GCC通知共享库中未定义的引用

我有一个与另一个(第三方)共享库链接的共享库.然后在我的应用程序中使用dlopen加载我的共享库.所有这一切都很好(假设文件在正确的路径等).

现在,问题是当我链接我的库时,我甚至不需要指定链接第三方共享库.GCC接受它而不报告有关未定义引用的错误.那么,问题; 我如何强制GCC通知我未定义的引用

如果我将库更改为(临时)可执行文件,则会获得未定义的引用(当不向链接器提供库时).(如果我指定它,工作正常.)

即,完成以下操作:

g++ -fPIC -shared -o libb.so b.o 
g++ -fPIC -shared -o liba.so a.o
g++ -o a.exe a.cpp 
Run Code Online (Sandbox Code Playgroud)

第二行没有给出错误,第三行抱怨未定义的引用.

示例代码:

啊:

class a
{
public:
    void foobar();
};
Run Code Online (Sandbox Code Playgroud)

a.cpp:

#include "a.h"
#include "b.h"

void a::foobar()
{
    b myB;
    myB.foobar();
}

int main()
{
    a myA; myA.foobar();
}
Run Code Online (Sandbox Code Playgroud)

BH:

class b
{
public:
    void foobar();
};
Run Code Online (Sandbox Code Playgroud)

b.cpp:

#include "b.h"

void b::foobar()
{
}
Run Code Online (Sandbox Code Playgroud)

c++ shared-libraries dynamic-linking

50
推荐指数
2
解决办法
4万
查看次数

GCC ABI兼容性

据我所知,不可能链接使用不同版本的GCC应用程序二进制接口(ABI)的库.是否对每个版本的GCC都进行了ABI更改?如果我使用GCC 4.3.2,是否可以链接使用4.3.1构建的库?是否有某种矩阵列出了我可以组合GCC版本的所有方法?

c++ compatibility gcc abi

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

const函数中的成员赋值

我有一个类成员myMember,它是一个myType指针.我想在声明为const的函数中分配此成员.我这样做:

void func() const
{
     ...
     const_cast<myType*>(myMember) = new myType();
     ...
}
Run Code Online (Sandbox Code Playgroud)

这样做在VC++中工作正常,但GCC给出了错误消息"左值作为赋值的左值".

使成员可变允许我简单地删除const_cast并分配值.但是,我并不完全确定这会带来其他副作用.

我可以指定我的会员而不必让会员变成可变的吗?怎么样?是否有任何副作用使成员变得可变?

c++ const function member variable-assignment

9
推荐指数
4
解决办法
8925
查看次数

在.deb文件中包含许可协议

如何在.deb文件中包含许可协议交互?这个问题对Linux的支持点击直通许可证只要求如果有可能,但不知道如何.另外,我不确定deb软件包的许可证信息是否真的可以使用...

我知道可以将文本作为包描述的一部分包含在内,但我更倾向于将其与Windows MSI安装程序类似.

请注意,我不希望在应用程序第一次运行时弹出许可证.

我正在使用dpkg-deb在Ubuntu 8.10上生成.deb文件.

linux licensing dpkg deb debconf

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

半通用功能

我有一堆重载函数,可以处理某些数据类型,如int,double和strings.这些函数中的大多数执行相同的操作,其中仅允许一组特定的数据类型.这意味着我无法创建一个简单的通用模板函数,因为我失去了类型安全性(并且可能会导致函数内的验证运行时问题).

是否可以创建"半通用编译时类型安全功能"?如果是这样,怎么样?如果没有,这是否会出现在C++ 0x中?

一个(无效的)想法;

template <typename T, restrict: int, std::string >
void foo(T bar);
...
foo((int)0); // OK
foo((std::string)"foobar"); // OK
foo((double)0.0); // Compile Error
Run Code Online (Sandbox Code Playgroud)

注意:我意识到我可以创建一个具有重载构造函数和赋值运算符的类,并将该类的变量传递给函数.

c++ generics function

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

C++运算符重载 - 从类转换

在将Windows代码移植到Linux时,我在GCC 4.2.3中遇到以下错误消息.(是的,我知道这是一个旧的版本,但我不能轻易升级.)

main.cpp:16: error: call of overloaded ‘list(MyClass&)’ is ambiguous
/usr/include/c++/4.2/bits/stl_list.h:495: note: candidates are: std::list<_Tp, _Alloc>::list(const std::list<_Tp, _Alloc>&) [with _Tp = unsigned char, _Alloc = std::allocator<unsigned char>]
/usr/include/c++/4.2/bits/stl_list.h:484: note:                 std::list<_Tp, _Alloc>::list(size_t, const _Tp&, const _Alloc&) [with _Tp = unsigned char, _Alloc = std::allocator<unsigned char>]
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码生成此错误.

#include <list>
class MyClass
    {
    public:
        MyClass(){}

        operator std::list<unsigned char>() const { std::list<unsigned char> a; return a; }
        operator unsigned char() const { unsigned char a; return a; }

    };

    int main()
    {
        MyClass a; …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-overloading operators operator-keyword

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