Не могу связаться с .so файлом на Mac с CMake - PullRequest
0 голосов
/ 02 января 2019

Я работаю над расширением PHP 7, используя Swig, и пытаюсь связаться с 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 ]

0 голосов
/ 03 января 2019

Я узнал, как / что делать по этой ссылке: лязг и неопределенные символы при создании библиотеки

libphp7.so не нужно связывать во время компиляции, во время выполнения работает нормально. Это можно включить, установив CXX_FLAG (подробности см. По ссылке).

0 голосов
/ 02 января 2019

Хотя Apple рекомендует, чтобы пакетам было дано расширение .bundle, многие разработчики предоставляют им расширение .so для кроссплатформенного знакомства.В Linux не делается различий между общим модулем (комплектом для MacOS) и разделяемой библиотекой (dylib в MacOS.)MacOS.Либо это должен быть dylib, чтобы связать его, либо вам нужно загрузить .so с помощью API-интерфейсов dyld.

Эта ссылка дает пример того, как динамически загружать пакет на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;
}
...