草庐IT

c++ - 符号可见性和命名空间

我正在Linux和gcc上试验C++符号可见性。似乎首选的方法是使用-fvisibility=hidden,并根据Visibilitygccwiki页面(http://gcc.gnu.org/wiki/Visibility)一个接一个地导出使用的符号。我的问题是许多库不能很好地处理这个问题,他们忘记显式导出符号,这是一个严重的问题。在修复了几个bug之后,甚至boost的某些部分仍然可能受到影响。当然这些错误应该被修复,但在此之前我想使用一种“安全”的方式来隐藏尽可能多的符号。我想出了一个解决方案:我将所有符号放在一个命名空间中,并在其上使用符号隐藏属性并导出公共(public)接口(

c++ - 编译opencv框架的未知错误: Undefined symbols: "_CGImageDestinationCreateWithURL"

Xcode给了我以下错误,我真的不知道该怎么办,这让我发疯了。我正在导入一个OpenCV框架,所以问题可能存在或与编译器有关。谁能告诉我要做什么或搜索什么?Undefinedsymbols:"_CGImageDestinationCreateWithURL",referencedfrom:cv::ImageIOEncoder::write(cv::Matconst&,std::vector>const&)inOpenCV(grfmt_imageio.o)"_CGImageDestinationAddImage",referencedfrom:cv::ImageIOEncoder::wr

c++ - 编译opencv框架的未知错误: Undefined symbols: "_CGImageDestinationCreateWithURL"

Xcode给了我以下错误,我真的不知道该怎么办,这让我发疯了。我正在导入一个OpenCV框架,所以问题可能存在或与编译器有关。谁能告诉我要做什么或搜索什么?Undefinedsymbols:"_CGImageDestinationCreateWithURL",referencedfrom:cv::ImageIOEncoder::write(cv::Matconst&,std::vector>const&)inOpenCV(grfmt_imageio.o)"_CGImageDestinationAddImage",referencedfrom:cv::ImageIOEncoder::wr

c++ - 在 C++ 中共享相同名称的类和命名空间

假设我在命名空间“abc”中有一个名为“foo”的类...namespaceabc{classfoo{inta;intb;};}...然后说我在不同的命名空间中有另一个名为“abc”的类#include"foo.h"namespacefoo{classabc{abc::a=10;};}abc::a不会是已定义类型,因为它将搜索类abc,而不是命名空间abc。我将如何正确引用另一个命名空间中的对象,其中另一个命名空间与我所在的类具有相同的名称? 最佳答案 您可以使用::abc::xx,即将变量或类型标识为其绝对命名空间路径。如果您不指

c++ - 在 C++ 中共享相同名称的类和命名空间

假设我在命名空间“abc”中有一个名为“foo”的类...namespaceabc{classfoo{inta;intb;};}...然后说我在不同的命名空间中有另一个名为“abc”的类#include"foo.h"namespacefoo{classabc{abc::a=10;};}abc::a不会是已定义类型,因为它将搜索类abc,而不是命名空间abc。我将如何正确引用另一个命名空间中的对象,其中另一个命名空间与我所在的类具有相同的名称? 最佳答案 您可以使用::abc::xx,即将变量或类型标识为其绝对命名空间路径。如果您不指

c++ - 编译错误 : Undefined symbols: "_main", 引用自 : start in crt1. 10.5.o

我有以下代码:#includeusingnamespacestd;classtesting{inttest()const;inttest1(consttesting&test2);};inttesting::test()const{return1;}inttesting::test1(consttesting&test2){test2.test();return1;}编译后出现如下错误:Undefinedsymbols:"_main",referencedfrom:startincrt1.10.5.old:symbol(s)notfoundcollect2:ldreturned1exi

c++ - 编译错误 : Undefined symbols: "_main", 引用自 : start in crt1. 10.5.o

我有以下代码:#includeusingnamespacestd;classtesting{inttest()const;inttest1(consttesting&test2);};inttesting::test()const{return1;}inttesting::test1(consttesting&test2){test2.test();return1;}编译后出现如下错误:Undefinedsymbols:"_main",referencedfrom:startincrt1.10.5.old:symbol(s)notfoundcollect2:ldreturned1exi

c++ - 剥离符号的最佳方法

上周我发布了一个应用程序的Linux和Windows版本。在发布之后,我们意识到这些符号并没有被剥离,我的经理认为(我不同意)它可能会让用户理解我们的算法。无论如何,现在,我必须清理符号并重新发布应用程序。我的问题,在Linux中去除符号的最佳方法是什么?在Windows中去除符号的最佳方法是什么? 最佳答案 使用Windows上的VisualC++(和其他Microsoft编译器),符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb文件)的单独文件中。只是不要提供.pdb文件。使用GNU工具链,您可以使用

c++ - 剥离符号的最佳方法

上周我发布了一个应用程序的Linux和Windows版本。在发布之后,我们意识到这些符号并没有被剥离,我的经理认为(我不同意)它可能会让用户理解我们的算法。无论如何,现在,我必须清理符号并重新发布应用程序。我的问题,在Linux中去除符号的最佳方法是什么?在Windows中去除符号的最佳方法是什么? 最佳答案 使用Windows上的VisualC++(和其他Microsoft编译器),符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb文件)的单独文件中。只是不要提供.pdb文件。使用GNU工具链,您可以使用

c++ - 符号可见性,异常,运行时错误

我试图更好地理解符号的可见性。GCCWiki(http://gcc.gnu.org/wiki/Visibility)包含有关“C++异常问题”的部分。根据GCCWiki,由于未导出异常,可能存在运行时错误。没有编译时错误/警告的运行时错误非常危险,因此我试图更好地理解问题。我做了一些实验,但仍然无法复制。任何想法如何重现该问题?Wiki互相提及了三个库,因此我制作了三个小型库。我运行以下命令:没有vtable的异常类(按预期工作):make./dsouser带vtable的异常类,但不导出(甚至不编译):makeHAS_VIRTUAL=1异常类导出的vtable(按预期工作):make