代码之家  ›  专栏  ›  技术社区  ›  Jason

无法使用cmake链接到Mac上的.so文件

  •  0
  • Jason  · 技术社区  · 5 年前

    我正在使用swig开发一个php 7扩展,并试图链接到libphp7.so。从我的cmakelists.txt文件:

    find_library(php7_lib php7 PATHS "/usr/local/Cellar/php/7.3.0/lib/httpd/modules" NO_DEFAULT_PATH)
    target_link_libraries(navdb_php7_client_api ${php7_lib} dl)
    

    但我得到一个错误:

    [100%] Linking CXX shared module .../lib/libnavdb_php7_client_api.so 
    ...
    ld: can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB) file '/usr/local/Cellar/php/7.3.0/lib/httpd/modules/libphp7.so' for architecture x86_64
    

    我试图链接到的文件:

    $ file /usr/local/Cellar/php/7.3.0/lib/httpd/modules/libphp7.so
    /usr/local/Cellar/php/7.3.0/lib/httpd/modules/libphp7.so: Mach-O 64-bit bundle x86_64
    

    有什么解决办法吗?

    2 回复  |  直到 5 年前
        1
  •  0
  •   Cinder Biscuits    5 年前

    尽管苹果公司建议将捆绑包扩展 .bundle 很多开发人员给他们 .so 为了跨平台熟悉而扩展。在Linux上,共享模块(MacOS上的包)和共享库(MacOS上的dylib)之间没有区别。

    理解这一点,就像 ld 声明,您不能链接到MacOS上的mh_包。它要么需要是一个dylib来链接它,要么需要加载 所以 使用dyld API。

    This link 给出了如何在MacOS上动态加载捆绑包的示例:

    #include <stdio.h>
    #import <mach-o/dyld.h>
    
    int main( )
    {
      int the_answer;
      int rc;                // Success or failure result value
      NSObjectFileImage img; // Represents the bundle's object file
      NSModule handle;       // Handle to the loaded bundle
      NSSymbol sym;          // Represents a symbol in the bundle
    
      int (*get_answer) (void);  // Function pointer for get_answer
    
      /* Get an object file for the bundle. */
      rc = NSCreateObjectFileImageFromFile("libanswer.bundle", &img);
      if (rc != NSObjectFileImageSuccess) {
        fprintf(stderr, "Could not load libanswer.bundle.\n");
        exit(-1);
      }
    
      /* Get a handle for the bundle. */
      handle = NSLinkModule(img, "libanswer.bundle", FALSE);
    
      /* Look up the get_answer function. */
      sym = NSLookupSymbolInModule(handle, "_get_answer");
      if (sym == NULL)
      {
        fprintf(stderr, "Could not find symbol: _get_answer.\n");
        exit(-2);
      }
    
      /* Get the address of the function. */
      get_answer = NSAddressOfSymbol(sym);
    
      /* Invoke the function and display the answer. */
      the_answer = get_answer( );
      printf("The answer is... %d\n", the_answer);
    
      fprintf(stderr, "%d??!!\n", the_answer);
      return 0;
    }
    
        2
  •  0
  •   Jason    5 年前

    我从这个链接中了解了如何/怎么做: Clang and undefined symbols when building a library

    libphp7.so不需要在编译时链接到,运行时可以正常工作。这可以通过设置cxx_标志来启用(有关详细信息,请参阅链接)。