在SAS中使用带有PROC PROTO的linux c ++库

时间:2017-04-02 11:31:32

标签: c++ linux c++11 sas

我想将自己的库与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环境中不可用。

1 个答案:

答案 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罚款中的链接阶段。