Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用g+与ACE-lib链接时出现一些问题+;_C++_Linux_G++_Visibility - Fatal编程技术网

C++ 使用g+与ACE-lib链接时出现一些问题+;

C++ 使用g+与ACE-lib链接时出现一些问题+;,c++,linux,g++,visibility,C++,Linux,G++,Visibility,我在Suse 11 x86机器上使用ACE6.0.2。gcc的版本是4.3,ACE-TAO库编译没有问题 我想做的测试很简单,但就是不能通过 我有三份档案。 a1.h定义了a类 class A { public: A(); void print(); }; a1.cpp有一个从ACE lib调用方法的函数 #include "a1.h" #include <ace/Thread.h> #include <iostream&

我在Suse 11 x86机器上使用ACE6.0.2。gcc的版本是4.3,ACE-TAO库编译没有问题

我想做的测试很简单,但就是不能通过

我有三份档案。 a1.h定义了a类

class A 
{ 
    public: 
        A(); 
        void print(); 
};
a1.cpp有一个从ACE lib调用方法的函数

#include "a1.h" 
#include <ace/Thread.h> 
#include <iostream> 

A::A(){} 

void A::print() 
{ 
    long t=ACE_Thread::self(); 
    std::cout<<t<<std::endl; 
} 
我使用的编译命令是:

1.使用ACE_线程生成a1.o

g++-c-fPIC-fno严格别名-fvisibility=hidden-fvisibility inlines hidden-O3-ggdb-pthread-Wall-W-Wpointer arith-pipe-D_GNU SOURCE-I/opt/ACE_wrappers-DACE_HAS_VALGRIND-D_ACE_INLINE_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-oa1.oa1.cpp

2.生成共享libT.so

g++-pthread-Wl,-O3-shared-o libT.so a1.o-Wl,-E-L/opt/ACE_wrappers-L-L/opt/ACE_wrappers/lib-lACE-ldl-lrt

3.生成main.o

g++-c-fno严格别名-fvisibility=hidden-fvisibility inlines hidden-O3-ggdb-pthread-Wall-W-Wpointer arith-pipe-D_GNU-SOURCE-I/opt/ACE_wrappers-DACE_HAS_VALGRIND-D_ACE_INLINE_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-o main.o main.cpp-lACE-ldl-lrt

4.链接并生成可执行文件

g++-fno严格别名-fvisibility=hidden-fvisibility inlines hidden-O3-ggdb-pthread-Wall-W-Wpointer arith-pipe-D_GNU_-SOURCE-I/opt/ACE_wrappers-DACE_HAS_VALGRIND-D_ACE_INLINE_u-I-Wl,-E-L/opt/ACE_wrappers/lib-L-o main.o-lT-lACE-ldl-lrt

问题发生在步骤4:

main.o: In function `main': 

/main.cpp:5: undefined reference to `A::A()' 
/main.cpp:6: undefined reference to `A::print()' 

<>我是Linux下的C++新手,不明白为什么会这样。我的编译命令一定有问题。提前谢谢您的帮助

您刚刚启用了
-fvisibility=hidden
标志,默认情况下,该标志使所有符号都隐藏。因此,您的类
a
对于您编译的共享库之外的任何对象都不可见

有两种解决方案:

  • 不要使用
    -fvisibility=hidden
    标志。默认情况下,这将使所有符号可见
  • A
    类(以及您希望从“外部世界”访问的共享库中的几乎所有其他内容)标记为public。这是特定于编译器的,通常通过宏来完成。有关gcc的更多信息,请参阅
  • 我想说清楚,这个问题是你的,也只是你的问题。它绝对与Ace或任何其他库无关


    希望能有帮助。祝你好运

    谢谢用户1349058!经过几个小时的研究,幸运的是我找到了你的评论,而且效果很好

    例如,我在Linux上构建ACE库32位时使用的命令是:

    $ make static_libs=1 buildbits=32 no_hidden_visibility=1
    $ make install 
    

    几年前我和ACE一起工作。我所做的是从ACE发行版中选取一个示例项目,删除了几乎所有的代码,然后开始添加我的代码,最终成为一个相当大的项目。好的是,我使用了现有的构建系统,它可以在所有ACE支持的平台上工作——所有类型的商业Unix、Linux和Windows。最好不要写“谢谢”的回答或评论。请删除您的答案以删除感谢便条。
    $ make static_libs=1 buildbits=32 no_hidden_visibility=1
    $ make install