天道酬勤,学无止境

Mac 动态库疯狂(可能仅限 Fortran)(Mac Dynamic Library Craziness (May be Fortran Only))

问题

我有这个 fortran 90 文件(将代码添加到问题的底部),我使用以下命令将其编译到 OS X Mavericks 上的动态库中: gfortran -dynamiclib trianglepy.f90 -o libtriangle.dylib 。 这将生成存储在我的桌面上的 libtriangle.dylib。 我可以使用这个库制作一个 C++ 文件(代码附在底部)。 我比使用g++ main.cpp -o main -std=c++11 -L ~/Desktop/ -ltriangle编译代码。 这完美地编译了代码。 但是当我运行生成的可执行文件时,出现以下错误:

dyld: Library not loaded: libtriangle.dylib
  Referenced from: /Users/zacharykraus/./main
  Reason: image not found
Trace/BPT trap: 5

当我运行otool -L main我得到

main:
    libtriangle.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

如果我尝试将正确的路径导出到 LD_LIBRARY_PATH 或 DYLD_LIBRARY_PATH。 我犯了同样的错误。 让可执行文件 main 运行的唯一方法是将文件 main 移动到桌面。 这成功运行以产生:

the angles are 33.5496 61.5496 28 
the sides are 2.2 3.5 1.86885

注意:我认为三角形实际上并不存在,而是针对实际问题。 有人可以向我解释如何让可执行文件从与 libtriangle.dylib 所在的目录不同的目录运行吗? 另外,为什么我的可执行文件仅在我将可执行文件移动到 libtriangle.dylib 所在的同一目录时才运行?

生成 libtriangle.dylib 的 Fortran 90 代码是:

!post all functions here
!double precision function area(side,angle)
!   double precision side(3),angle(3)
!end

double precision function sidelos(angle1,angle2,side2)
    double precision angle1, angle2, side2
    !law of sines to calculate the missing side
    sidelos=side2*sin(angle1*3.141593d0/180d0)/sin(angle2*3.141593d0/180d0)
end

double precision function anglelos(side1, side2, angle2)
    double precision side1, side2, angle2
    !law of sines to calculate the missing angle
    anglelos=asin(side1*sin(angle2*3.141593d0/180d0)/side2)*180d0/3.141593d0
end

double precision function sideloc(side1, side2, angle3)
    double precision side1, side2, angle3
    !law of cosines to calculate side 3
    sideloc=sqrt(side1**2 + side2**2 - 2d0*side1*side2*cos(angle3*3.141593d0/180d0))
end

double precision function angleloc(side1, side2, side3)
    implicit none
    double precision side1, side2, side3
    !law of cosines to calculate angle3
    angleloc=acos((side1**2 + side2**2 - side3**2) / 2d0/side1/side2)*180d0/3.141593d0
end

!post all subroutines here
subroutine asa(angle1, side3, angle2, angle, side)
    double precision angle(3), side(3), sidelos
    double precision angle1, side1, angle2
    integer i
    !f2py intent(out) angle
    !f2py intent(out) side
    angle(1) = angle1
    angle(2) = angle2
    side(3) = side3
    !calculate the third angle
    angle(3)=180-angle(1)-angle(2)
    do i=1,2
    !calculate the missing sides using law of sines
        side(i)=sidelos(angle(i),angle(3),side(3))
    end do
end

subroutine sas(side1, angle3, side2, angle, side)
    double precision angle(3), side(3), sideloc, anglelos
    double precision side1, angle3, side2
    integer i
    !f2py intent(out) angle
    !f2py intent(out) side
    side(1) = side1
    side(2) = side2
    angle(3) = angle3
    !calculate the missing side with law of cosines
    side(3)=sideloc(side(1),side(2),angle(3))
    do i=1,2
        !calculate the missing angles with the law of sines
        angle(i)=anglelos(side(i), side(3), angle(3))
    end do
end

subroutine sss(side1, side2, side3, angle, side)
    double precision angle(3), side(3), angleloc, anglelos
    double precision side1, side2, side3
    integer i
    !f2py intent(out) angle
    !f2py intent(out) side
    side(1) = side1
    side(2) = side2
    side(3) = side3
    !calculate the missing angle with law of cosines
    angle(3)=angleloc(side(1),side(2),side(3))
    do i=1,2
        !calculate the missing angles with the law of sines
        angle(i)=anglelos(side(i), side(3), angle(3))
    end do
end

subroutine aas(angle1, angle2, side1, angle, side)
    double precision angle(3), side(3), sidelos
    double precision angle1, angle2, side1
    integer i
    !f2py intent(out) angle
    !f2py intent(out) side
    angle(1) = angle1
    angle(2) = angle2
    side(1) = side1
    !calculate the third angle
    angle(3)=180-angle(1)-angle(2)
    do i=2,3
        !calculate the missing sides using law of sines
        side(i)=sidelos(angle(i),angle(1),side(1))
    end do
end

链接到动态库的 C++ 代码是:

extern "C" void sas_(double*, double*, double*, double*, double*);
#include <iostream>
using namespace std;
int main()
{
  double side1 = 2.2, side2= 3.5, angle3 = 28;
  double angle[3], side[3];
  sas_(&side1, &angle3, &side2, angle, side);
  cout << "the angles are ";
  for (double value : angle)
    cout << value <<" ";
  cout << endl;

  cout<<"the sides are ";
  for (double value : side)
    cout << value << " ";
  cout << endl;
  return 0;
}
回答1

答案与动态库在 mac os x 中的工作方式有关。 os x 中的动态库总是在库中存储一个路径。 编译动态库时,默认路径是库的名称。 在编译时链接动态库时,库中的路径存储在可执行文件中。 因此,当您尝试运行 main 时,可执行文件会在当前目录中查找 libtriangle.dylib。 这就是为什么如果将 libtriangle.dylib 复制到当前目录,程序可以正确运行的原因。

要解决此问题,请添加 -install_name 和编译的绝对路径。 然后重新编译链接到 libtriangle.dylib 的 c++ 文件。 重新编译后重新运行otool -L main给出:

main:
/Users/zacharykraus/Desktop/libtriangle.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

现在可执行文件可以正确运行,而无需将动态库复制到当前路径。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • macOS上的.so和.dylib有什么区别?(What are the differences between .so and .dylib on macOS?)
    问题 .dylib是macOS上的动态库扩展,但是当我不能/不应该使用传统的unix .so共享库时,对我来说还不清楚。 我有一些问题: 从概念上讲,.so和.dylib之间的主要区别是什么? 什么时候可以/应该在另一个上使用? 编译技巧和窍门(例如,替换gcc -shared -fPIC,因为它在osx上不起作用) 回答1 Mac OS X用于可执行文件和库的Mach-O目标文件格式区分了共享库和动态加载的模块。 使用otool -hv some_file看到的文件类型some_file 。 Mach-O共享库的文件类型为MH_DYLIB并带有扩展名.dylib。 可以使用通常的静态链接器标志来链接它们,例如, -lfoo表示libfoo.dylib。 可以通过将-dynamiclib标志传递给编译器来创建它们。 ( -fPIC是默认值,无需指定。) 可加载模块在Mach-O语言中称为“捆绑”。 它们的文件类型MH_BUNDLE 。 他们可以携带任何扩展名; Apple建议使用扩展名.bundle ,但是出于兼容性考虑,大多数移植的软件都使用.so 。 通常情况下,你会使用扩展的应用程序插件捆绑; 在这种情况下,捆绑软件将针对应用程序二进制文件进行链接,以访问应用程序的导出API。 可以通过将-bundle标志传递给编译器来创建它们。 dylib和bundle都可以使用dl
  • Mac Dynamic Library Craziness (May be Fortran Only)
    I have this fortran 90 file (will add the code to the bottom of the question) which I have compiled into a dynamic library on OS X Mavericks using the following command: gfortran -dynamiclib trianglepy.f90 -o libtriangle.dylib. This produces libtriangle.dylib which is stored on my desktop. I can than make a C++ file using this library(code attached at bottom). I than compile the code using g++ main.cpp -o main -std=c++11 -L ~/Desktop/ -ltriangle. This compiles the code perfectly. But when I run the produced executable, I get the following error: dyld: Library not loaded: libtriangle.dylib
  • 如何使用带有动态库的 etrace 来按时间顺序跟踪 C++ 中的函数调用?(How to use etrace with a dynamic library for chronological traceing of function calls in C++?)
    问题 背景: 我有一个很大的模拟工具,我需要了解它的逻辑行为。 为了做到这一点,如果我有函数调用的时间顺序,我会得到最多的帮助,作为一个最小的工作示例。 我在网上找到了很多工具,比如 CygProfiler 和 etrace。 我在找到解决方案时变得非常痛苦,以至于我开始遵循最疯狂的解决方案,即在调试器中使用“step into”。 如果您有一个小程序但不是一个完整的模拟工具,这是一个不错的选择。 问题: 我面临的问题之一是上述解决方案最初是为C并且在编译时生成静态文件 ( *.o )。 另一方面,模拟工具生成一个共享库 ( .so )。 我对较低级别的东西了解不多,所以当我尝试链接它们时似乎失败了。 我专门查看了etrace文档,它说: 要了解如何修改 ptrace.c 以使用动态库,请查看 example2 目录。 那里的源代码还创建了一个独立的可执行文件,但 PTRACE_REFERENCE_FUNCTION 宏的定义与动态库的定义一样。 如果您查看 repo, example和example2文件夹中的文件之间没有区别。 只有在example2有一个额外的.h文件。 另一方面,如果您查看src/ptrace.c ,它会说: 在动态库上使用 ptrace 时,必须将 PTRACE_REFERENCE_FUNCTION 宏设置为库中函数的名称。
  • 使用完整路径链接到Mac上的动态库(Linking to a dynamic library on a Mac with full path)
    问题 我正在链接一个(Python扩展)库,该库通过以下命令(使用cmake生成)嵌入了Matlab引擎 c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python 导致 $ otool -L library.so library.so: @loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0) @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0) /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1) /opt/local/lib
  • 在 Mac OS X 中链接动态库 (libjvm.dylib)(rpath 问题)(Linking a dynamic library (libjvm.dylib) in Mac OS X (rpath issue))
    问题 我确实有一个需要与libjvm链接的应用程序(来自 JDK 的库需要执行 JNI 绑定)。 当我使用-L告诉libjvm.dylib的位置时,它会成功编译和链接。 但是,当我运行二进制文件时,我得到: dyld: Library not loaded: @rpath/libjvm.dylib Referenced from: <my home directory>/./mybinary Reason: image not found 到目前为止,我发现我可以像这样运行指定 LD_LIBRARY_PATH 的二进制文件: LD_LIBRARY_PATH=<path to libfolder installation> ./mybinary 但我当然不想那样。 如果每次启动应用程序时都必须一次又一次地给出它,为什么我还要指定确切的位置?! 我还了解到 mac os x 上的动态库确实获得了一种表明位置的戳记。 但是我不知道rpath是什么(对我来说似乎是一个变量,但是如何在链接期间设置它?)。 该应用程序是使用 haskell 构建的,但我同样可以使用ld手动链接目标文件。 但是,我被困在 rpath 问题上 - 它可能对 JDK 库很特别吗? 这是我为了构建所做的工作: ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre
  • 在Mac OS X上可以使用DYLD_LIBRARY_PATH吗? 而且,动态库搜索算法是什么?(Is it OK to use DYLD_LIBRARY_PATH on Mac OS X? And, what's the dynamic library search algorithm with it?)
    问题 我阅读了一些不鼓励使用DYLD_LIBRARY_PATH的文章,因为动态库的路径应使用-install_name,@ rpath和@loader_path进行固定。 就使程序在Linux和Mac OS X上均可运行而言,Mac OS X的DYLD_LIBRARY_PATH的作用与Linux的LD_LIBRARY_PATH的作用相同。 而且,我们可以共享(几乎)没有-install_name和@rpath的相同make文件。 在Mac OS X上使用DYLD_LIBRARY_PATH是否可以? 当二进制文件找不到动态库时,Mac OS X中的动态库搜索算法是什么? 当前目录-> DYLD_LIBRARY_PATH目录...? 回答1 如您所述, DYLD_LIBRARY_PATH行为类似于其他* nix上的LD_LIBRARY_PATH 。 但是,您应该查看另一个环境变量DYLD_FALLBACK_LIBRARY_PATH 。 通常,建议仅在开发中使用(在osx和linux上),因为当您使用不具有相同符号表的库进行覆盖时,它们会导致符号查找错误。 一个很好的例子是,当您尝试使用自定义安装覆盖VecLib的默认安装(例如blas lapack)时。 如果设置了DYLD_LIBRARY_PATH ,将在链接到系统VecLib的应用程序中导致找不到符号的错误,如果未设置
  • 在Mac OS X上链接不同的C ++标准库(Link different C++ standard libraries on Mac OS X)
    问题 现在,Mac OS X上可以存在多个C ++标准库,这看起来很混乱。 根据https://stackoverflow.com/a/8457799/1772681的说法,混合libstdc ++和libc ++会导致链接错误,这可以捕获这种危险情况,这是一件好事。 另一方面,仍有2种情况需要更多调查,我在github gist(https://gist.github.com/manphiz/7195515)中为此创建了一些测试用例。 它确认混合使用链接到libstdc ++(来自系统或原始GNU GCC的动态库)和libc ++(系统)的动态库将导致链接错误。 但是,如果一个动态库链接到系统libstdc ++,而另一个动态库链接到香草GNU GCC libstdc ++,然后又将它们链接到二进制文件,则对于我的简单测试用例,它甚至可以在运行时使用。 $ make -f Makefile.system_gnu g++-4.8 -g -Wall -fPIC -o main.o -c main.cc g++-4.8 -g -Wall -fPIC -o test_a.o -c test_a.cc g++-4.8 -dynamiclib -o libtest_a.dylib test_a.o clang++ -g -Wall -fPIC "-stdlib=libstdc++" -o
  • Mac上的'未加载库:@ rpath / libcudart.7.5.dylib'TensorFlow错误('Library not loaded: @rpath/libcudart.7.5.dylib' TensorFlow Error on Mac)
    问题 我正在使用OS X El Capitan(10.11.4)。 我只是按照此处的pip安装说明下载了TensorFlow。 一切都进行得很顺利,尽管我确实收到了一些警告消息,例如: The directory '/Users/myusername/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want the -H flag. 和 You are using pip version 6.0.8, however version 8.1.2 is available. 即使我刚刚安装了pip。 然后,当我在Python中测试TensorFlow时,出现了错误: >>> import tensorflow as tf Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Frameworks
  • 图书馆? 静态的? 动态的? 还是框架? 在另一个项目中的项目(Library? Static? Dynamic? Or Framework? Project inside another project)
    问题 我有一个现有的iOS应用程序,并且想要添加大量我作为另一个项目开发的代码,以简化测试。 新的块基本上用于将图像保存到各种共享服务等。由于该共享代码需要大量测试和将来的更新,因此我想知道将该代码块合并到现有应用程序中的最佳方法。 我不知道它应该是静态库,动态库还是框架,老实说,我不确定这有什么区别,或者我该如何处理并在Xcode中进行设置。 我所知道的是,我需要/想要为共享代码保留一个单独的测试和更新应用程序,并让主应用程序使用它。 回答1 首先,一些一般定义(特定于iOS): 静态库-编译时链接的代码单位,不会更改。 然而,iOS的静态库不允许包含图像/资产(唯一的代码)。 不过,您可以通过使用媒体捆绑包来解决这一难题。 可以在Wikipedia上找到更好,更正式的定义。 动态库-运行时链接的代码和/或资产的单位,可能会更改。 但是,仅允许Apple为iOS创建动态库。 您无权创建这些文件,因为这会使您的应用程序被拒绝。 (有关其他信息,请参见其他SO帖子进行确认和推理)。 软件框架-完成任务的一组编译代码...因此,您实际上可以拥有一个静态框架或一个动态框架,它们通常只是上述内容的编译版本。 有关更多详细信息,请参见软件框架上的Wiki。 因此,在iOS上,您唯一的选择基本上是使用静态库或静态框架(主要区别是静态框架最常作为已编译的.a文件分发
  • OSX:PHP错误本地主机并且无法加载动态库(OSX: PHP Error localhost and unable to load dynamic library)
    问题 我该如何解决这个PHP错误? PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20100525/php_pdo_mysql.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20100525/php_pdo_mysql.dll, 9): image not found in Unknown on line 0 我在mac / mavericks上,我犯了一个错误,做了一个sudo cp /private/etc/php.ini.default /private/etc/php.ini所以现在当我运行php -v时我得到了上面提到的错误 回答1 按照它为我工作... 对我来说,错误是: $ sudo php -v # PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20121212/phalcon.so' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20121212
  • 将动态库注入企业应用程序 (ipa)(Inject dynamic library into enterprise app (ipa))
    问题 我想将我的库注入现有的企业应用程序(ipa 文件)。 我找到了 mach_inject,但这仅适用于 MacOSX。 这是可能的,因为 https://www.mocana.com 正在这样做。 请帮忙。 任何想法,建议都会非常有帮助。 回答1 目前尚不清楚您想要做什么,但 mach_inject 是用户应用程序使用 Mach 端口与 MAC OS 内核交互的一种方式,它与 IPA 根本无关,IPA 本质上是一个存档 - 类似于 zip 或 Tar。 我怀疑根据您所描述的内容,您有一个库,您希望将链接编辑/包含在用户应用程序中,但您不希望他们看到您的源代码,反之亦然。 我不熟悉 Mocana,但根据您所描述的,它使用 IPA 进行分发,这是完全可能的,但是使用预编译的对象模块也是如此,Facebook SDK 分发的对象模块也是如此。 无论如何,无论是通过企业分发服务器还是应用商店分发,在分发之前,都需要对整个包进行签名,然后设备才能下载并运行它。 回答2 是的,您将能够将库注入现有的 ipa,然后使用您的企业证书对其进行签名。 以下是我如何做到这一点的简介 在 MachOView 中查看可执行文件,找到加载命令的地址。 然后使用地址编辑十六进制并将加载命令计数增加 1(假设我正在注入一个库),我还必须增加命令偏移量。 有一些工具可用于将库注入十六进制
  • 为什么我不能用 LD_LIBRARY_PATH 覆盖动态库的搜索路径?(Why I cannot override search path of dynamic libraries with LD_LIBRARY_PATH?)
    问题 编辑:我解决了这个问题,解决方案如下。 我正在一个专用于科学计算的共享计算集群中构建代码,因此我只能控制我的主文件夹中的文件。 虽然我以 fftw 为例,但我想了解具体原因,为什么我尝试设置 LD_LIBRARY_PATH 不起作用。 我像这样在我的主文件夹中构建 fftw 和 fftw_mpi 库 ./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared make install 它构建得很好,但在 install/fftw/lib 中,我发现新构建的 libfftw3_mpi.so 链接到错误版本的 fftw 库。 $ ldd libfftw3_mpi.so |grep fftw libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000) 如果我现在尝试将 LD_LIBRARY_PATH 设置为正确指向此目录,它仍然更喜欢错误的库: $ export LD_LIBRARY_PATH=$HOME/install/fftw/lib $ ldd libfftw3_mpi.so |grep fftw libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)
  • 如何在 Mac OS X 10.8 上安装 hg convert 所需的 python subversion 绑定?(How to install python subversion bindings needed by hg convert on Mac OS X 10.8?)
    问题 我正在寻找一种解决方案,最好是干净和简单的,以使hg convert能够在带有 SVN 存储库的 OS X 10.8 上工作。 目前,如果您尝试转换 SVN 存储库,您将收到could not load Subversion python bindings错误。 注意:Alex Martelli 在另一个答案中建议为 OS X 安装 CollabNet Subversion 发行版,但似乎仍然无法在 OS X 10.8 上安装最新的 CollabNet 版本(安装程序锁定)。 回答1 使用自制软件 最简单的方法是使用自制软件和--with-python标志从源代码安装subversion 。 首先,确保安装了命令行工具。 使用 Mavericks 和 Xcode 5,即使没有完全安装命令行工具,像cc这样的大多数命令也能正常工作。 如果你没有/usr/include目录,那么首先你需要运行 $ xcode-select --install 安装命令行工具后,运行: $ brew install subversion --with-python $ mkdir -p ~/Library/Python/2.7/lib/python/site-packages $ echo $(brew --cellar)/subversion/1.8.5/lib/svn-python \ > ~
  • 在OS X上从C中的dlopen()动态库访问主程序全局变量(Accessing main program global variables from a dlopen()ed dynamic library in C on OS X)
    问题 我正在维护一个具有一些类似于插件功能的小型应用程序,该功能是通过运行时加载的动态模块来实现的。 具体来说,由于它是Gtk +应用程序,因此我使用的是gmodule,但该问题同样适用于基于dlfcn.h / dlopen()的动态库加载。 我的主程序只有一个全局结构变量,其中包含一些全局信息。 我希望此信息可用于动态加载的插件中定义的功能。 在Linux上,我可以直接引用此全局变量-效果很好,而且我猜测gcc或链接程序会负责将全局变量从主程序导出到动态库中。 问题是,这在Mac OS X上不起作用。有没有办法在OS X上做到这一点? 如果不是,是否有更“最佳实践”的方法将全局信息公开给动态加载的库? 回答1 将global放入main.c中,并在共享库中将其声明为extern,然后尝试以下操作: MACOSX_DEPLOYMENT_TARGET=10.3 ld -dylib -undefined dynamic_lookup -o multiply.so multiply.o 或者 MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -o multiply.so multiply.o 它在Mac OS X 10.4上对我有用 回答2 既然你宣布 int global
  • 在Mac OS X上执行brew install gcc之后,由于缺少fortran编译器,仍然无法安装scipy(Still can't install scipy due to missing fortran compiler after brew install gcc on Mac OS X)
    问题 我已阅读并按照此答案安装scipy / numpy / theano。 但是,在brew install gcc之后,仍然由于缺少Fortran编译器的错误而失败。 HomeBrew安装了gcc-4.8时,没有安装任何gfortran或g95命令。 我认为gfortran可能只是gcc的同义词,然后我创建了一个符号链接 $ cd /usr/local/bin $ ln -s gcc-4.8 gfortran $ pip install scipy 然后,它检测到gfortran命令,但仍然没有任何Fortran编译器抱怨 customize Gnu95FCompiler Found executable /usr/local/bin/gfortran customize NAGFCompiler Could not locate executable f95 customize AbsoftFCompiler Could not locate executable f90 Could not locate executable f77 customize IBMFCompiler Could not locate executable xlf90 Could not locate executable xlf customize IntelFCompiler Could
  • 从 Rust 调用动态链接的 Haskell 代码(Calling dynamically linked Haskell code from Rust)
    问题 我正在尝试用一些 Haskell 代码编译一些 Rust 代码。 我有一个使用文件Fibonacci.hs设置的测试系统,其中包含一个函数,该函数在 Haskell 中计算Fibonacci.hs数并通过 Haskell 的 FFI 将该函数导出为fibonacci_hs (如下所示:https://github.com/nh2/haskell-from- python,虽然我会在底部复制和粘贴),并且在wrapper.c中定义了要导出的函数,以调用初始化和退出 Haskell 的 RTS。 代码如下所示: {- Fibonacci.hs -} {-# LANGUAGE ForeignFunctionInterface #-} module Fibonacci where import Foreign.C.Types fibonacci :: Int -> Int fibonacci n = fibs !! n where fibs = 0 : 1 : zipWith (+) fibs (tail fibs) fibonacci_hs :: CInt -> CInt fibonacci_hs = fromIntegral . fibonacci . fromIntegral foreign export ccall fibonacci_hs :: CInt -> CInt /
  • 如何创建ada lib.a并链接到C(How to create an ada lib.a and link to C)
    问题 我正在尝试创建一个ada库,并尝试了一些不同的方法。 我尝试使用makefiles编译项目,并尝试从所有.o文件创建一个库,这似乎无法正常工作。 然后,我向adacore寻求支持,他们向我指出了对ada和c项目都使用.gpr文件的方向,以及应该创建库的ada.gpr的使用方向。 这几乎可以正常工作,但是当它尝试编译ada时,我得到了未定义的引用。 我尝试过的内容:命令行: ar rc libmy_lib.a *.o 当我尝试阅读库中的内容时 ld libmy_lib.a 我收到此错误ld:警告:找不到条目符号_start; 没有设置起始地址 项目文件:我的ada项目文件prj.gpr project Prj is for Source_Dirs use ("source1/", "source2", ....); for Object_Dir use "."; for Languages use ("Ada"); for Library_Name use "test"; for Library_Dir use "lib"; for Library_Interface use ( --All my ada packages ); package Naming is for Spec_Suffix ("ada") use ".1.ada"; for Body_Suffix (
  • OSX:如何将静态库转换为动态库?(OSX: How do I convert a static library to a dynamic one?)
    问题 假设我在安装了 Xcode 4.4 的运行 Mountain Lion 的 Mac 上有一个名为 somelib.a 的第三方库。 我想从中得到一个名为 somelib.dylib 的动态库。 一个合适的 Linux 命令是: g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.so 其中 -whole-archive 和 -no-whole-archive 被传递给链接器。 当我为 Mac 做同样的事情时: g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.dylib ld 失败并出现错误: ld: unknown option: -whole-archive 似乎 OSX 上的 ld 与 GNU ld 不同。 我必须如何修改上述命令才能获得所需的结果? 先感谢您! 回答1 我找到了解决我的问题的方法: g++ -fpic -shared -Wl,-all_load somelib.a -Wl,-noall_load -o somelib.dylib 所需的参数是 -all_load 和 -noall_load。 回答2 注意:OSX ld链接器文档的链接。
  • 导入tensorflow报错!惨痛教训! ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败。终于解决!
    一、问题来源 环境:win10Anaconda 2020.07.20虚拟环境 tf2nlp + python3.7 问题来源:由于用了公司的笔记本,所以需要给那个笔记本装环境,装了Anaconda,创建了虚拟环境tf2nlp,进入虚拟环境,安装:pip install tensorflow==2.0,启动python,导入tensorflow时,出现了以下报错。然后我根据报错提示,去微软官网下载VC_redist.x64.exe 进行安装,然而报错还是一样。网上的相关文章都是说要降低tf的版本,然而降级并不是我的想法,我想要用的是tensorflow2.x,我是一个不将就的人,而且tf1.x已经过时,不再拥有维护,所以我更加坚定的去使用tf2,所以一直在坚持寻找解决方法,终于…(含泪高兴) 【注:在我自己的个人电脑上是一切正常的!】 报错如下: ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败。 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Anaconda3\envs\tf2nlp\lib
  • Mac OS X 上 XDG_CONFIG_HOME 和 XDG_DATA_HOME 的等价物?(Equivalents of XDG_CONFIG_HOME and XDG_DATA_HOME on Mac OS X?)
    问题 我打算开发一个跨平台的脚本。 在 Linux 和其他操作系统上,它会将配置存储在XDG_CONFIG_HOME并将数据文件(特别是下载的插件)存储在XDG_DATA_HOME 。 在 Windows 上,它会同时使用APPDATA (除非有人有更好的主意)。 但是,在 Mac OS X 上正确的做法是什么? 在我第一眼浏览 Macbook 的~/Library目录时,我看到了Preferences和Application Support文件夹。 我最初计划使用这些,但Preferences似乎只包含具有反向域名的 plist,如com.apple.foo.bar.baz.plist ,并且Application Support每个文件夹都对应于/Applications一个包,所以我不确定系统对不符合其标准的文件的反应如何。 将它们直接存储在~/Library可能是一种选择,但如果有更好的地方,我不想用流浪的myscript.conf文件污染它。 我应该在哪里存储这些文件? (请不要只说~/.myscript 。我知道这是 Unix 的传统,但是在主目录中看到随机的点文件让我很恼火。) 回答1 我会使用~/Library/Application Support/script_name/ 。 Application Support中的子目录通常由各种应用程序使用,包括