第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

时间:2021-05-10 16:15:21
这是我写的代码:
第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

然后我用这两条命令生成了这个.so
第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

然后再编译main.c,再然后用main.o链接.so的时候,老是有这样的错误提示
第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

这是我的环境变量(.bashrc文件):
第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

实在找不出哪里出错了。。。 第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

9 个解决方案

#1


暂时没看出问题来,能用nm 查看一下so的符号表么

#2


引用 1 楼 cd901017 的回复:
暂时没看出问题来,能用nm 查看一下so的符号表么

第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

这个吗?

#3


尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

#4


引用 3 楼 cd901017 的回复:
尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

也不行。。

#5


引用 3 楼 cd901017 的回复:
尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?

#6


引用 5 楼 C_Java_php_python 的回复:
Quote: 引用 3 楼 cd901017 的回复:

尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?
这个或许跟gcc的版本有关系。。

#7


引用 6 楼 cd901017 的回复:
Quote: 引用 5 楼 C_Java_php_python 的回复:

Quote: 引用 3 楼 cd901017 的回复:

尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?
这个或许跟gcc的版本有关系。。

好吧

#8


编译的时候把库链接放在最后

#9


编译 so
gcc test.c -o libtest.so  -shared -fpic
会成生  libtest.so

编译main.c
gcc -o test main.c  -L. -ltest  -Wl,-rpath,./

-------------------------------------------
gcc 时依赖要放在后面
linux 默认情况是不会在当前目去找 so 
如果你的环竟 ld_libaray_path 也没指向当前目录  (可以用 ldconfig 来查看 ...)
 所以要添加   -Wl,-rpath,./    (注:这个参中间不能有空格)

#1


暂时没看出问题来,能用nm 查看一下so的符号表么

#2


引用 1 楼 cd901017 的回复:
暂时没看出问题来,能用nm 查看一下so的符号表么

第一次试着写linux的.so,总是有个错误,不知道哪里出了问题

这个吗?

#3


尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

#4


引用 3 楼 cd901017 的回复:
尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

也不行。。

#5


引用 3 楼 cd901017 的回复:
尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?

#6


引用 5 楼 C_Java_php_python 的回复:
Quote: 引用 3 楼 cd901017 的回复:

尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?
这个或许跟gcc的版本有关系。。

#7


引用 6 楼 cd901017 的回复:
Quote: 引用 5 楼 C_Java_php_python 的回复:

Quote: 引用 3 楼 cd901017 的回复:

尝试一下改变gcc的选项顺序,比如gcc -L -ltest -o main.c

gcc main.c -ltest -L. -o test 这个顺序可以,可是为什么?
这个或许跟gcc的版本有关系。。

好吧

#8


编译的时候把库链接放在最后

#9


编译 so
gcc test.c -o libtest.so  -shared -fpic
会成生  libtest.so

编译main.c
gcc -o test main.c  -L. -ltest  -Wl,-rpath,./

-------------------------------------------
gcc 时依赖要放在后面
linux 默认情况是不会在当前目去找 so 
如果你的环竟 ld_libaray_path 也没指向当前目录  (可以用 ldconfig 来查看 ...)
 所以要添加   -Wl,-rpath,./    (注:这个参中间不能有空格)