我想将自己的库与SAS PROC PROTO一起使用。我正在使用似乎在Linux上运行的大学版。
我尝试执行以下操作:
将我的源文件编译成静态库(因为我不确定哪个libc或其他标准库可用或者哪个版本可用,所以我想将它们全部包含在内)。我使用了以下内容:g++ -static -std=c++11 -c foo.cpp -o libfoo.o
然后ar rcs libfoo.a libfoo.o
然后我在SAS平台上传了libfoo.a,制作了如下的SAS程序:
%let root = /folders/foobar/;
libname lib "&root";
proc proto package=lib.Foobar
Label="Foobar" ;
link "&root/libfoo.a" ;
然而,我收到以下错误:
64 link "&root/libfoo.a" ;
65
66 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
ERROR: Unable to load 'libfoo.a'.
ERROR: Extension Load Failure: OS Error: -1 (/folders/foobar/libfoo.a: invalid ELF header)
ERROR: Unable to load extension: (/folders/foobar/libtrie.a)
ERROR: Could not find extension: (libtrie.a)
ERROR: Could not find extension: (libtrie.a)
从那时起我觉得SAS期待一个动态库。所以我想我应该首先静态链接以包含所有依赖库,然后动态链接以便SAS可以加载它..
这是正确的方法吗?在Linux / g ++上最好如何做到这一点?
编辑1:
因此动态地链接代码,但是因为怀疑glibc在SAS环境中不一样。我收到以下错误消息:
ERROR: Extension Load Failure: OS Error: -1 (/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by
/folders/foobar/libfoo.so))
编辑2: 我尝试用连接选项修补一点:
g++ -std=c++11 -fPIC -static /usr/lib64/libc.a -shared foo.cpp -static-libstdc++ -static-libgcc -o libfoo2.so
然而,这在SAS中出现了类似的错误:
ERROR: Extension Load Failure: OS Error: -1 (/lib64/libc.so.6: version `GLIBC_2.14' not found (required by
/folders/myshortcuts/Desktop/libfoo2.so))
虽然修补我认为readelf
提供了所需库的信息,但是libc.so仍然需要,但在SAS环境中不可用。
答案 0 :(得分:0)
所以,我发现Centos 6.6的环境足够接近(可能只需要版本2.12中的libc)到SAS大学发行版。
在wallstprog的帮助下,我发现我需要在Centos上安装g ++ 4.8.2才能编译c ++ 11(因为这是用c ++ 98编写的版本)因此可以在Centos上从源代码构建。
然后编译就变得微不足道了:
g++ -fPIC -std=c++11 -c foo.cpp -o foo.o
g++ foo.o -shared -static-libstc++ -o libfoo.so
这通过了proc proto罚款中的链接阶段。