OSX CGGetActiveDisplayList - > ld:找不到架构x86_64的符号

时间:2018-01-08 00:22:15

标签: c++ objective-c macos core-graphics build-error

我正在尝试为nodejs模块编写跨系统显示管理。我在Windows上取得了成功,但现在我被困在osx上(linux是下一个)。

我只是无法获得这么短的代码。我正在使用“make osx”进行编译,只要我不使用CGGetActiveDisplayList,它就能正常工作。 https://developer.apple.com/documentation/coregraphics/1454603-cggetactivedisplaylist

据我所研究,我包含了正确的头文件,但我更怀疑这一点,但无法找到/看到任何其他信息。

如果我注释掉CGGetActiveDisplayList代码,CGDirectDisplayID仍然被接受,所以我假设它并非完全错误。这可能很简单,但我已经被困了几个小时而且非常令人沮丧。

我尝试过使用osx.m(objective_c)并得到同样的错误。

该文件是“osx.cc”

#ifdef __APPLE__

#include <ApplicationServices/ApplicationServices.h>

int main(int argc, const char * argv[]){
    printf("\nHello!\n\n");
    CGDirectDisplayID displays[32];
    uint32_t count;//sizeof(displays)/sizeof(displays[0])
    if (CGGetActiveDisplayList(32, displays, &count) != kCGErrorSuccess)
    {
        printf("failed to get display list");
        exit(EXIT_FAILURE);
    }
}

#endif
谢谢你的时间!

编辑:

make osx
c++     osx.cc   -o osx
Undefined symbols for architecture x86_64:
  "_CGGetActiveDisplayList", referenced from:
      _main in osx-b7fd55.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [osx] Error 1

1 个答案:

答案 0 :(得分:1)

导入/包含头文件是不够的,您必须将Core Graphics框架添加到链接器。框架名称显示在您引用的手册中。请查看类似问题Undefined symbols for architecture x86_64 in Objective-C

的答案
  1. 从xcode中项目窗口左侧的项目导航器中选择项目文件。
  2. 在项目设置编辑器中选择要添加框架的目标。
  3. 选择“Build Phases”选项卡,然后单击“Link Binary With Libraries”旁边的小三角形以查看应用程序中的所有框架。
  4. 要添加框架,请单击框架列表下方的“+”。
  5. 选择所需的框架。