求教在linux调用C++动态库问题

m
minquan
楼主 (未名空间)

国内某交易所提供了量化接口,C++的

主要是一些头文件,在linux里有两个so

我发现两个头文件和两个so的主文件名是对应的,除去.h和.so后缀

只不过是 小写(头文件的主文件名)+_se = so动态库的主文件名

这是不是错的?根本不能调用?我看到有人说是必须得前面加lib才能调用

然而我翻遍了h文件的#注释,没有提到过se啊?

那么是不是也得把_se删掉才能用?
g
gogogo2

windows下也会有这种情况,dll里的函数名也有前缀,

要自己判断自己加前缀,
m
minquan

谢谢,这个问题很复杂,牵扯到接口改变的问题。

我还是得去问下国内同行。

【 在 gogogo2 (googlebot) 的大作中提到: 】
: windows下也会有这种情况,dll里的函数名也有前缀,
: 要自己判断自己加前缀,

c
cimu

.so 文件名应该随便改阿, 你要 compile against 才行。 when you compile you
need to the .so file, you can change it to what ever you want.

you can dynamically load the .so file and then call the function there too, but you do not have to do this way.
b
bouncingball

Linux需要在调用前export目录直到存放.so的那级目录,才能连接上动态库。实在不行就让国内的给个静态库,用静态库调用不会有问题。
m
minquan2

问题在于,头文件里面,一没有写so名,二没有写路径

如果go只include了头文件,而没有写so,是否就没有办法调用?

我看go的LDFLAG行写了-l,应该就是调用动态库

而这个动态库,默认是从/usr/lib/里找的?

即默认是Linux安装好的?

【 在 cimu (此木) 的大作中提到: 】
: .so 文件名应该随便改阿, 你要 compile against 才行。 when you compile you : need to the .so file, you can change it to what ever you want.
: you can dynamically load the .so file and then call the function there too,
: but you do not have to do this way.

p
pickvalue

应该可以 gcc main.cpp /your/path/xyzfoo.so

【 在 minquan2 (三民主义 五权宪法) 的大作中提到: 】
: 问题在于,头文件里面,一没有写so名,二没有写路径
: 如果go只include了头文件,而没有写so,是否就没有办法调用?
: 我看go的LDFLAG行写了-l,应该就是调用动态库
: 而这个动态库,默认是从/usr/lib/里找的?
: 即默认是Linux安装好的?
: ,

omgpop

作为一个叫兽,这种abc问题你不能读一下thefxxkingdoc自己解决吗?这都要上板面问丢人不?

【 在 minquan (三民主义) 的大作中提到: 】
: 国内某交易所提供了量化接口,C++的
: 主要是一些头文件,在linux里有两个so
: 我发现两个头文件和两个so的主文件名是对应的,除去.h和.so后缀
: 只不过是 小写(头文件的主文件名)+_se = so动态库的主文件名
: 这是不是错的?根本不能调用?我看到有人说是必须得前面加lib才能调用
: 然而我翻遍了h文件的#注释,没有提到过se啊?
: 那么是不是也得把_se删掉才能用?

m
minquan

我不是教授。这种事本来应该是外包方给我搞定的。

【 在 omgpop (See my signature) 的大作中提到: 】
: 作为一个叫兽,这种abc问题你不能读一下thefxxkingdoc自己解决吗?这都要上板面问
: 丢人不?

m
minquan

谢谢。不过我用cmake

【 在 pickvalue (pickvalue) 的大作中提到: 】
: 应该可以 gcc main.cpp /your/path/xyzfoo.so

p
pptwo

带_se的接口后面坑多着呢,你的外包有没有告诉你要把程序放到root下面跑?

【 在 minquan (三民主义) 的大作中提到: 】
: 我不是教授。这种事本来应该是外包方给我搞定的。

m
minquan

带se是交易所后来搞的,说是什么穿透式监管。
正因为程序做的时候还不带se,所以现在我自己在处理新版本的se的接口。
_se是必须放在root下跑的意思吗?
这个文件名自带属性?

【 在 pptwo (pp) 的大作中提到: 】
: 带_se的接口后面坑多着呢,你的外包有没有告诉你要把程序放到root下面跑?

mitbbs2715

这问题好奇特, 你是不是没学过C/C++的编译
头文件和库文件的名字不需要对应
头文件不过是告诉你接口, linker会自动按照header函数的signature(也就是 函数名, arg的个数和类型)去找库里面找, 你只要保证你给它的所有库文件合并以后包含唯一
一个该signature即可(也不能超过一个), 只不过C++有name mangling 你如果要连接非C++代码会比较麻烦. 如果是这样你需要让他们重新编译一下, 或者你自己重新包一下. 不过我建议还是用C++比较好, C重用性太差了

【 在 minquan (三民主义) 的大作中提到: 】
: 国内某交易所提供了量化接口,C++的
: 主要是一些头文件,在linux里有两个so
: 我发现两个头文件和两个so的主文件名是对应的,除去.h和.so后缀
: 只不过是 小写(头文件的主文件名)+_se = so动态库的主文件名
: 这是不是错的?根本不能调用?我看到有人说是必须得前面加lib才能调用
: 然而我翻遍了h文件的#注释,没有提到过se啊?
: 那么是不是也得把_se删掉才能用?

m
minquan

没学过。而且现在的情况是C++做动态库,go去调。
如果go的调用或者C++动态库哪里做的不好,就崩溃,然后也找不到原因。
而且C++的动态库又比C++的主程序阉割掉很多语法,例如printf就用不了,只能用
stout。

往往改一行之后就得重新全部编译一遍,再测。极烦人。

【 在 mitbbs2715 (好吃不懒做) 的大作中提到: 】
: 这问题好奇特, 你是不是没学过C/C++的编译
: 头文件和库文件的名字不需要对应
: 头文件不过是告诉你接口, linker会自动按照header函数的signature(也就是 函数
名,
: arg的个数和类型)去找库里面找, 你只要保证你给它的所有库文件合并以后包含唯一
: 一个该signature即可(也不能超过一个), 只不过C++有name mangling 你如果要连接非
: C++代码会比较麻烦. 如果是这样你需要让他们重新编译一下, 或者你自己重新包一
下.
: 不过我建议还是用C++比较好, C重用性太差了

C
Caravel

无论哪种情况,相信文件名也都不会是个大问题,改下Makefile就行了

【 在 minquan (三民主义) 的大作中提到: 】
: 没学过。而且现在的情况是C++做动态库,go去调。
: 如果go的调用或者C++动态库哪里做的不好,就崩溃,然后也找不到原因。
: 而且C++的动态库又比C++的主程序阉割掉很多语法,例如printf就用不了,只能用
: stout。
: 往往改一行之后就得重新全部编译一遍,再测。极烦人。
: 名,
: 下.

a
async

ctp穿透式这是两年前的事儿吧,你咋还在搞这个,github上很多例子参考一下照着做
就行
g
guvest

要不你用cpp写个简单的测试程序调用Cpp的库,看有没问题。如果没有,那你就去查go 调用Cpp 的手册。如果有同样的问题,你就去找那个Cpp库的信息。

总之,测试代码可以用来实证和分析问题。

【 在 minquan(三民主义) 的大作中提到: 】

: 没学过。而且现在的情况是C 做动态库,go去调。

: 如果go的调用或者C 动态库哪里做的不好,就崩溃,然后也找不到原因。

: 而且C 的动态库又比C 的主程序阉割掉很多语法,例如printf就用不了,只能用

: stout。

: 往往改一行之后就得重新全部编译一遍,再测。极烦人。

: 名,

: 下.

m
minquan

你介绍一个动态库的吧,谢谢。

【 在 async (async) 的大作中提到: 】
: ctp穿透式这是两年前的事儿吧,你咋还在搞这个,github上很多例子参考一下照着做
: 就行

m
minquan

谢谢,我这是赶鸭子上架。库弄完了,就先不搞C++了。别的方面还一堆破事。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 要不你用cpp写个简单的测试程序调用Cpp的库,看有没问题。如果没有,那你就去查go
: 调用Cpp 的手册。如果有同样的问题,你就去找那个Cpp库的信息。
: 总之,测试代码可以用来实证和分析问题。
:
: 没学过。而且现在的情况是C 做动态库,go去调。
:
: 如果go的调用或者C 动态库哪里做的不好,就崩溃,然后也找不到原因。
:
: 而且C 的动态库又比C 的主程序阉割掉很多语法,例如printf就用不了,只能用
:
: stout。
:
: 往往改一行之后就得重新全部编译一遍,再测。极烦人。
:
: 名,
:
: 下.
: ...................