针对LAPACK的静态链接

针对LAPACK的静态链接,c,linker,compilation,lapack,blas,C,Linker,Compilation,Lapack,Blas,我正在尝试发布一些软件,目前正在为构建过程编写一个脚本。我被困在一个我从未想过我会是的东西上,在x86_64 linux上静态链接LAPACK。在配置过程中,AC_SEARCH_LIB([main],[lapack])起作用,但lapack单元的编译不起作用,例如unfined引用“dsyev”——没有lapack/blas例程不被注意 我已经确认我已经安装了这些库,甚至自己用适当的选项编译了它们,使它们保持静态,并获得相同的结果 这是我几年前第一次体验LAPACK时使用的一个示例,它可以动态工

我正在尝试发布一些软件,目前正在为构建过程编写一个脚本。我被困在一个我从未想过我会是的东西上,在x86_64 linux上静态链接LAPACK。在配置过程中,
AC_SEARCH_LIB([main],[lapack])
起作用,但lapack单元的编译不起作用,例如
unfined引用“dsyev”
——没有lapack/blas例程不被注意

我已经确认我已经安装了这些库,甚至自己用适当的选项编译了它们,使它们保持静态,并获得相同的结果

这是我几年前第一次体验LAPACK时使用的一个示例,它可以动态工作,但不能静态工作:

我用来编译的两种方法如下:

gcc -llapack -o eigen eigen.c
gcc -static -llapack -o eigen eigen.c

你的链接顺序是错误的。将库链接到需要它们的代码之后,而不是之前。像这样:

gcc -o eigen eigen.c -llapack 
gcc -static -o eigen eigen.c -llapack
这将解决联系问题


为了回答接下来的问题,GNU
ld
文档中这样说:

在命令中写入此选项的位置会有所不同;这个 链接器按顺序搜索和处理库和对象文件 它们是指定的。因此,
foo.o-lz bar.o'搜索库
z'之后 文件foo.o但在bar.o之前。如果bar.o指的是'z'中的函数, 这些函数可能无法加载

通常,以这种方式找到的文件是库文件和归档文件 其成员是对象文件。链接器通过以下方式处理存档文件: 扫描其中定义符号的成员,这些符号到目前为止 已被引用但未定义。但是如果找到的文件是 普通对象文件,它以通常的方式链接

链接器将通过一个文件查找未解析的符号,并按照您提供的顺序(即“从左到右”)跟踪文件。如果在读取文件时尚未指定依赖项,则链接器将无法满足该依赖项。链接列表中的每个对象只解析一次


还请注意,在链接共享库或对象文件时检测到循环依赖项的情况下,GNU ld可以进行重新排序。但是静态库只解析一次未知符号。

真的,我可以发誓,通过昨晚/今天的搜索,我已经读到现代链接器将对它们重新排序。这是可行的,但它现在似乎找不到我的blas例程——甚至是w/
-lblas
。干杯。要使此功能完全工作所需的其他库,
-llapack-lblas-lgfortran-lm
。链接器将尝试调整链接顺序,以满足活动依赖关系图的要求。但是链接语句仍然是“从左到右”读取的,如果您指定的库在当前集合中没有依赖项,它就会被跳过。这就是我在这里发生的事情,你说“当前集合中没有依赖关系”是什么意思?有一个依赖项,我的程序依赖于它。但是在指定库时,你的程序还没有编译成对象(请记住,读“从左到右”),所以它被跳过。