如何在osx上使用clang编译共享库

gis*_*ard 9 c macos gcc shared-libraries clang

源文件

rsetti::fastidio { /tmp }-> cat foo.c

    #include <stdio.h>
    void ACFunction() {
      printf("ACFunction()\n");
      AGoFunction();
    }
Run Code Online (Sandbox Code Playgroud)

编译共享库

rsetti::fastidio { /tmp }-> clang -shared -o libfoo.so foo.c

    foo.c:4:3: warning: implicit declaration of function 'AGoFunction' is invalid in C99 [-Wimplicit-function-declaration]
      AGoFunction();
      ^
    1 warning generated.
    Undefined symbols for architecture x86_64:
      "_AGoFunction", referenced from:
          _ACFunction in foo-lFDQ4g.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

rsetti::fastidio { /tmp }->
Run Code Online (Sandbox Code Playgroud)

linux + gcc上的相同代码可以轻松编译.

gis*_*ard 24

通过使用:

-Wl,-undefined -Wl,dynamic_lookup
Run Code Online (Sandbox Code Playgroud)

要么

clang -shared -undefined dynamic_lookup -o libfoo.so foo.c
Run Code Online (Sandbox Code Playgroud)

似乎保持了GCC的相同行为.

  • .dylib是MacOS上共享库的规范扩展,使用-dynamiclib而不是shared。参见/sf/ask/163777561/ (2认同)
  • 请注意,“-undefineddynamic_lookup”具有不需要的副作用,例如当类中存在一些未定义的符号时,编译器诊断将被静音。当尝试在运行时加载库时,这些未定义的符号会弹出,并出现误导性错误,例如“dlopen:找不到图像”。有关详细信息,请参阅 /sf/answers/2165401521/。 (2认同)