把静态成员函数导出到so包的错误

DoDoMouse 2014-05-27 10:32:12
环境:ubuntu + eclipse
我做了一个简单的代码实验,如下代码:

class MyFile
{
public:
static void TestLib()
{
cout<<"In MyFile::TestLib()"<<endl;
}

void TestLibA()
{
cout<<"In MyFile::TestLibA()"<<endl;
}
};

编译输出so文件,在另一个项目中使用该so文件,发现可以通过MyFile的对象调用TestLib(),却无法通过类直接调用TestLib(),更找不到TestLibA()。

我开始怀疑是link错了,尝试着改动TestLib()里面print的内容,编译之后ldconfig,发现调用TestLib()是改动之后的内容,说明确实link到了最新文件,就是编译时一直报错。

不知道为什么?
求助
...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
静之深 2014-05-29
  • 打赏
  • 举报
回复
引用 5 楼 u011761982 的回复:
[quote=引用 4 楼 jingzhishen 的回复:]
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -shared -fPIC -o libtestlib.so testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ vim main.cpp 

[1]+  Stopped                 vim main.cpp
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ gcc -c main.cpp 
yingc@yingc:~/gcyin/test/tmp/csdn$ ll
total 48
drwxrwxr-x  2 yingc yingc  4096  5月 28 10:49 ./
drwxrwxr-x 17 yingc yingc  4096  5月 28 10:32 ../
-rwxrwxr-x  1 yingc yingc  6990  5月 28 10:48 libtestlib.so*
-rw-rw-r--  1 yingc yingc   520  5月 28 10:49 main.cpp
-rw-r--r--  1 yingc yingc 12288  5月 28 10:49 .main.cpp.swp
-rw-rw-r--  1 yingc yingc  2176  5月 28 10:49 main.o
-rw-rw-r--  1 yingc yingc   546  5月 28 10:48 testlib.cpp
-rw-rw-r--  1 yingc yingc   635  5月 28 10:47 testlib.h
-rw-rw-r--  1 yingc yingc  1448  5月 28 10:38 testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -o main main.o -L. -ltestlib
yingc@yingc:~/gcyin/test/tmp/csdn$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x02a9f9e7e9c76d2c9b277aff913bf5387a8d7f8d, not stripped
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ./main 
In MyFile::TestLib()
yingc@yingc:~/gcyin/test/tmp/csdn$ 
main.cpp:
#include "testlib.h"

int main()
{
▸   MyFile::TestLib();

▸   return 0;
}
testlib.cpp:
#include "testlib.h"


void MyFile::TestLibA()
{
▸   cout<<"In MyFile::TestLibA()"<<endl;
}
testlib.h:

#include <stdlib.h>
#include <iostream>
using namespace std;

class MyFile
{
▸   public:
▸   ▸   static void TestLib()
▸   ▸   {
▸   ▸   ▸   cout<<"In MyFile::TestLib()"<<endl;
▸   ▸   }

▸   ▸   void TestLibA();
};
问题解决,我分析的原因居然是在makefile里面生成.o文件的时候少了一个-c,而是直接-o了。 结果在产生.so的时候,又一次-o,用的时候读不出里面包含的函数了。 这个这是汗颜,花了那么长时间,最后还是通过objdump去分析才猜到的,羞愧呀。 还有一个要命的就是eclipse的智能感知出错了,智能感知的都是老的header文件的内容,我修改了header文件却感知不出来。 不知道这个怎么修复?[/quote] eclipse不经常用,这个不清楚
静之深 2014-05-28
  • 打赏
  • 举报
回复
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -shared -fPIC -o libtestlib.so testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ vim main.cpp 

[1]+  Stopped                 vim main.cpp
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ gcc -c main.cpp 
yingc@yingc:~/gcyin/test/tmp/csdn$ ll
total 48
drwxrwxr-x  2 yingc yingc  4096  5月 28 10:49 ./
drwxrwxr-x 17 yingc yingc  4096  5月 28 10:32 ../
-rwxrwxr-x  1 yingc yingc  6990  5月 28 10:48 libtestlib.so*
-rw-rw-r--  1 yingc yingc   520  5月 28 10:49 main.cpp
-rw-r--r--  1 yingc yingc 12288  5月 28 10:49 .main.cpp.swp
-rw-rw-r--  1 yingc yingc  2176  5月 28 10:49 main.o
-rw-rw-r--  1 yingc yingc   546  5月 28 10:48 testlib.cpp
-rw-rw-r--  1 yingc yingc   635  5月 28 10:47 testlib.h
-rw-rw-r--  1 yingc yingc  1448  5月 28 10:38 testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -o main main.o -L. -ltestlib
yingc@yingc:~/gcyin/test/tmp/csdn$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x02a9f9e7e9c76d2c9b277aff913bf5387a8d7f8d, not stripped
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ./main 
In MyFile::TestLib()
yingc@yingc:~/gcyin/test/tmp/csdn$ 
main.cpp:
#include "testlib.h"

int main()
{
▸   MyFile::TestLib();

▸   return 0;
}
testlib.cpp:
#include "testlib.h"


void MyFile::TestLibA()
{
▸   cout<<"In MyFile::TestLibA()"<<endl;
}
testlib.h:

#include <stdlib.h>
#include <iostream>
using namespace std;

class MyFile
{
▸   public:
▸   ▸   static void TestLib()
▸   ▸   {
▸   ▸   ▸   cout<<"In MyFile::TestLib()"<<endl;
▸   ▸   }

▸   ▸   void TestLibA();
};
DoDoMouse 2014-05-28
  • 打赏
  • 举报
回复
引用 4 楼 jingzhishen 的回复:
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -shared -fPIC -o libtestlib.so testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ vim main.cpp 

[1]+  Stopped                 vim main.cpp
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ 
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main.cpp  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ gcc -c main.cpp 
yingc@yingc:~/gcyin/test/tmp/csdn$ ll
total 48
drwxrwxr-x  2 yingc yingc  4096  5月 28 10:49 ./
drwxrwxr-x 17 yingc yingc  4096  5月 28 10:32 ../
-rwxrwxr-x  1 yingc yingc  6990  5月 28 10:48 libtestlib.so*
-rw-rw-r--  1 yingc yingc   520  5月 28 10:49 main.cpp
-rw-r--r--  1 yingc yingc 12288  5月 28 10:49 .main.cpp.swp
-rw-rw-r--  1 yingc yingc  2176  5月 28 10:49 main.o
-rw-rw-r--  1 yingc yingc   546  5月 28 10:48 testlib.cpp
-rw-rw-r--  1 yingc yingc   635  5月 28 10:47 testlib.h
-rw-rw-r--  1 yingc yingc  1448  5月 28 10:38 testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ g++ -o main main.o -L. -ltestlib
yingc@yingc:~/gcyin/test/tmp/csdn$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x02a9f9e7e9c76d2c9b277aff913bf5387a8d7f8d, not stripped
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
libtestlib.so  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ./main 
In MyFile::TestLib()
yingc@yingc:~/gcyin/test/tmp/csdn$ 
main.cpp:
#include "testlib.h"

int main()
{
▸   MyFile::TestLib();

▸   return 0;
}
testlib.cpp:
#include "testlib.h"


void MyFile::TestLibA()
{
▸   cout<<"In MyFile::TestLibA()"<<endl;
}
testlib.h:

#include <stdlib.h>
#include <iostream>
using namespace std;

class MyFile
{
▸   public:
▸   ▸   static void TestLib()
▸   ▸   {
▸   ▸   ▸   cout<<"In MyFile::TestLib()"<<endl;
▸   ▸   }

▸   ▸   void TestLibA();
};
问题解决,我分析的原因居然是在makefile里面生成.o文件的时候少了一个-c,而是直接-o了。 结果在产生.so的时候,又一次-o,用的时候读不出里面包含的函数了。 这个这是汗颜,花了那么长时间,最后还是通过objdump去分析才猜到的,羞愧呀。 还有一个要命的就是eclipse的智能感知出错了,智能感知的都是老的header文件的内容,我修改了header文件却感知不出来。 不知道这个怎么修复?
DoDoMouse 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 jingzhishen 的回复:
直接用g++编译看看,分成两块试下: 1:不要编译为so,直接在代码中使用 2:编译为so,再看看
直接使用没问题的,编译为so就有问题
静之深 2014-05-28
  • 打赏
  • 举报
回复
直接用g++编译看看,分成两块试下: 1:不要编译为so,直接在代码中使用 2:编译为so,再看看
DoDoMouse 2014-05-27
  • 打赏
  • 举报
回复
尝试使用类直接调静态方法的报错信息如下: Description Resource Path Location Type Invalid arguments 'Candidates are: void TestLib() ' Test.cpp /Test/src line 21 Semantic Error

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧